JAVA實現非對稱加密

2020-12-25 淚流雲

一、概述

非對稱加密算法概述,非對稱主要是相對於對稱加密算法而言的,對稱加密算法有一個密鑰和一個解鑰,非對稱算法有一個公鑰和一個私鑰,這兩個共同組成一個解鑰,才能實現解密。

DH:密鑰交換算法,算是非對稱加密算法的起源。

RSA:基於因子分解,應用最廣,RSA是可以雙向加密的,私鑰加密,公鑰解密;公鑰加密,私鑰解密,是目前世界上使用最廣的非對稱加密算法。

ELGamal:基於離散對數。

ECC:橢圓曲線加密。

非對稱加密算法:因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。非對稱加密算法需要兩個密鑰:公開密鑰和私有密鑰。公開密鑰與私有密鑰是一對的。如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密。如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密(某些算法有提供)。非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作為公用密鑰向其它方公開,得到該公用密鑰的乙方使用該密鑰對信息進行加密後再發送給甲方。甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。另一方面,甲方可以使用乙方提供的公鑰對信息進行加密後再發送給乙方,乙方再用自己的私匙對數據進行解密。

二、DH算法概述

// 1.初始化送方密KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");senderKeyPairGenerator.initialize(512); KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();// 送方公接收方(網、文件……)byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();// 2.初始化接收方密KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH"); X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc); PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec); DHParameterSpec dhParameterSpec = ((DHPublicKey) receiverPublicKey).getParams(); KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH"); receiverKeyPairGenerator.initialize(dhParameterSpec); KeyPair receiverKeypair = receiverKeyPairGenerator.generateKeyPair(); PrivateKey receiverPrivateKey = receiverKeypair.getPrivate();byte[] receiverPublicKeyEnc = receiverKeypair.getPublic().getEncoded();// 3.構建KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH"); receiverKeyAgreement.init(receiverPrivateKey); receiverKeyAgreement.doPhase(receiverPublicKey, true); SecretKey receiverDesKey = receiverKeyAgreement.generateSecret("DES"); KeyFactory senderKeyFactory = KeyFactory.getInstance("DH"); x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc); PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec); KeyAgreement senderKeyAgreement = KeyAgreement.getInstance("DH"); senderKeyAgreement.init(senderKeyPair.getPrivate()); senderKeyAgreement.doPhase(senderPublicKey, true); SecretKey senderDesKey = senderKeyAgreement.generateSecret("DES");if(Objects.equals(receiverDesKey, senderDesKey)) { System.out.println("雙方密相同。"); }// 4.加密Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, senderDesKey);byte[] result = cipher.doFinal("Hellow".getBytes()); System.out.println("bc dh encrypt:" + Base64.encodeBase64String(result));// 5.解密cipher.init(Cipher.DECRYPT_MODE, receiverDesKey); result = cipher.doFinal(result); System.out.println("bc dh decrypt:" + new String(result));

三、RSA算法實現及應用

// 1.初始化送方密

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); System.out.println("Public Key:" + Base64.encodeBase64String(rsaPublicKey.getEncoded())); System.out.println("Private Key:" + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));// 2.加密、公解密 ---- 加密PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] result = cipher.doFinal("hellow".getBytes()); System.out.println("加密、公解密 ---- 加密:" + Base64.encodeBase64String(result));// 3.加密、公解密 ---- 解密X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, publicKey); result = cipher.doFinal(result); System.out.println("加密、公解密 ---- 解密:" + new String(result));// 4.加密、私解密 ---- 加密X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); KeyFactory keyFactory2 = KeyFactory.getInstance("RSA"); PublicKey publicKey2 = keyFactory2.generatePublic(x509EncodedKeySpec2); Cipher cipher2 = Cipher.getInstance("RSA"); cipher2.init(Cipher.ENCRYPT_MODE, publicKey2);byte[] result2 = cipher2.doFinal("hellow".getBytes()); System.out.println("加密、私解密 ---- 加密:" + Base64.encodeBase64String(result2));// 5.解密、公加密 ---- 解密PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); KeyFactory keyFactory5 = KeyFactory.getInstance("RSA"); PrivateKey privateKey5 = keyFactory5.generatePrivate(pkcs8EncodedKeySpec5); Cipher cipher5 = Cipher.getInstance("RSA"); cipher5.init(Cipher.DECRYPT_MODE, privateKey5);byte[] result5 = cipher5.doFinal(result2); System.out.println("加密、私解密 ---- 解密:" + new String(result5));

四、Elgamal算法實現

ElGamal算法只提供了公鑰加密,私鑰解密形式,jdk中沒有實現,Bouncy Castle中對其進行了實現。

// 加入BouncyCastle支持

Security.addProvider(new BouncyCastleProvider());// 1.初始化送方密AlgorithmParameterGenerator algorithmParameterGenerator = AlgorithmParameterGenerator.getInstance("Elgamal");// 初始化參數生成器algorithmParameterGenerator.init(256);// 生成算法參數AlgorithmParameters algorithmParameters = algorithmParameterGenerator.generateParameters();// 構建參數材料DHParameterSpec dhParameterSpec = (DHParameterSpec)algorithmParameters.getParameterSpec(DHParameterSpec.class);// 例化密生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("Elgamal");// 初始化密鑰對生成器keyPairGenerator.initialize(dhParameterSpec, new SecureRandom());KeyPair keyPair = keyPairGenerator.generateKeyPair();// PublicKey elGamalPublicKey = keyPair.getPublic();// PrivateKey elGamalPrivateKey = keyPair.getPrivate(); System.out.println("Public Key:" + Base64.encodeBase64String(elGamalPublicKey.getEncoded())); System.out.println("Private Key:" + Base64.encodeBase64String(elGamalPrivateKey.getEncoded()));// 2.解密、公加密 ---- 加密// 初始化公 // 材料轉換X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(elGamalPublicKey.getEncoded());// 例化密工廠KeyFactory keyFactory2 = KeyFactory.getInstance("Elgamal");// 生公PublicKey publicKey2 = keyFactory2.generatePublic(x509EncodedKeySpec2);// 數據加密// Cipher cipher2 = Cipher.getInstance("Elgamal");Cipher cipher2 = Cipher.getInstance(keyFactory2.getAlgorithm()); cipher2.init(Cipher.ENCRYPT_MODE, publicKey2);byte[] result2 = cipher2.doFinal("hellow".getBytes()); System.out.println("加密、公解密 ---- 加密:" + Base64.encodeBase64String(result2));// 3.解密、公加密 ---- 解密PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(elGamalPrivateKey.getEncoded()); KeyFactory keyFactory5 = KeyFactory.getInstance("Elgamal"); PrivateKey privateKey5 = keyFactory5.generatePrivate(pkcs8EncodedKeySpec5); Cipher cipher5 = Cipher.getInstance(keyFactory5.getAlgorithm()); cipher5.init(Cipher.DECRYPT_MODE, privateKey5);byte[] result5 = cipher5.doFinal(result2); System.out.println("Elgamal 加密、公解密 ---- 解密:" + new String(result5));

相關焦點

  • JAVA實現對稱加密
    一、對稱加密算法-DES三、對稱加密算法-AESDES有漏洞,所以,產生了3重DES,3重DES的效率比較低,所以產生了AES。out.println("jdk aes desrypt:" + new String(result));四、對稱加密算法-PBEPBE本質上是對DES/3DES/AES對稱加密算法的包裝,不是新的算法,不過也是最為牛逼的一種方式
  • 對稱加密與非對稱加密
    正好借著這篇文章來說一說。對稱加密與非對稱加密首先我們先來說一下到底什麼是對稱加密,什麼是非對稱加密,這一節主要是用一些例子來介紹一下對稱加密和非對稱加密是什麼,如果你已經了解了,可以跳過本節。對稱加密高中生小明和小紅是一對「地下情侶」,可偏偏他們一個坐在教室前,一個坐在教室後,所以晚自習的時候也只能通過紙條傳情。
  • 為什麼非對稱加密比對稱加密慢?
    對稱加密與非對稱加密首先我們先來說一下到底什麼是對稱加密,什麼是非對稱加密,這一節主要是用一些例子來介紹一下對稱加密和非對稱加密是什麼,如果你已經了解了,可以跳過本節。對稱加密高中生小明和小紅是一對「地下情侶」,可偏偏他們一個坐在教室前,一個坐在教室後,所以晚自習的時候也只能通過紙條傳情。
  • 非對稱加密的應用
    非對稱"大致很好理解,意思和對稱相反,加密也能理解,但是非對稱加密是個什麼玩意兒。在開始聊非對稱加密之前,咱們先來聊聊對稱加密,什麼是對稱加密呢?首先我們要清楚,網絡中有些數據進行傳輸的時候,是需要加密的,比方說https,https中就用到了對稱加密。
  • 一文讀懂對稱加密算法、非對稱加密算法和Hash算法
    對稱加密算法不能實現籤名,因此籤名只能非對稱算法。由於對稱加密算法的密鑰管理是一個複雜的過程,密鑰的管理直接決定著他的安全性,因此當數據量很小時,我們可以考慮採用非對稱加密算法。在實際的操作過程中,我們通常採用的方式是:採用非對稱加密算法管理對稱算法的密鑰,然後用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。如果在選定了加密算法後,那採用多少位的密鑰呢?
  • 加密算法科普:des、aes加密、對稱、非對稱加密、Hash算法都是啥
    對稱密碼算法有時又叫傳統密碼算法、秘密密鑰算法或單密鑰算法,非對稱密碼算法也叫公開密鑰密碼算法或雙密鑰算法。對稱密碼算法的加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱算法中,加密解密密鑰是相同的。它要求發送者和接收者在安全通信之前,商定一個密鑰。對稱算法的安全性依賴於密鑰,洩漏密鑰就意味著任何人都能對消息進行加密解密。只要通信需要保密,密鑰就必須保密。
  • 非對稱加密——RSA
    本周先介紹RSA算法,希望能為非對稱加密的講解開個好頭~        在前兩篇文章中我們介紹了DES、AES、IDEA等多種對稱加密算法,雖然這些算法通過複雜的運算邏輯來保證其加密的安全性,但所有對稱加密算法都會存在密鑰配送問題。
  • 神奇的非對稱加密
    區塊鏈技術運用的密碼學算法主要為兩個部分:一是哈希算法,二是非對稱加密算法。 哈希算法在之前的文章《人人都能讀懂的比特幣挖礦原理》中有詳細的講解,感興趣的朋友可以查看之前的文章。 那什麼是非對稱加密呢? 了解一個事物,首先了解它的「敵人」——對稱加密。
  • 【非對稱加密】通俗易懂的解釋什麼是非對稱加密
    本期專題:非對稱加密本文原標題:如何用通俗易懂的話來解釋非對稱加密?怎麼給一個完全不懂密碼學的人講解什麼是非對稱(Asymmetric)/公鑰(Public Key)加密體制?本文中,作者試著用生活中的例子來講一講公鑰加密體制。
  • 對稱、非對稱公鑰加密是如何工作的?
    假設我們要用對稱加密技術傳輸數據,並保證數據不被其他人截獲,那麼我們就必須要將密鑰共享給接收者。如果接收者住在附近,我們可以直接用信封或其他線下辦法把密鑰交給他,但是如果接收者來自其他州或其他國家的話該怎麼辦?在這種情況下,發送密鑰的任務變得十分困難,因此要克服此問題,就要用到另一種名為「非對稱加密」的技術。
  • 聊聊對稱/非對稱加密在HTTPS中的使用
    對稱/非對稱加密算法能夠避免信息竊取,而消息摘要算法能夠避免信息篡改。對稱加密算法發送方和接收方需要持有同一把密鑰,發送消息和接收消息均使用該密鑰。相對於非對稱加密,對稱加密具有更高的加解密速度,但雙方都需要事先知道密鑰,密鑰在傳輸過程中可能會被竊取,因此安全性沒有非對稱加密高。
  • Java利用DES / 3DES / AES這三種算法分別實現對稱加密
    注意,這可不是我說的,是無數程式設計師總結的,話說的很實在也很精闢,若想長久可持續發展,多研究算法還是很有必要的,今天我給大家說說加密算法中的對稱加密算法,並且這裡將教會大家對稱加密算法的編程使用。包含DES、3DES和AES三種對稱加密算法的編程使用,乾貨滿滿。
  • PHP的OpenSSL加密擴展學習(二):非對稱加密
    PHP的OpenSSL加密擴展學習(二):非對稱加密上篇文章,我們了解了關於對稱和非對稱加密的一些相關的理論知識,也學習了使用 OpenSSL 來進行對稱加密的操作。今天,我們就更進一步,學習 OpenSSL 中的非對稱加密是如何實現的。
  • 非對稱加密算法——RSA加密原理及數學推導
    百度百科是這麼說的:RSA是一種非對稱的加密機制。是一種公開密鑰密碼體制。所謂的公開密鑰密碼體制就是使用不同的加密密鑰與解密密鑰,是一種「由已知加密密鑰推導出解密密鑰在計算上是不可行的」密碼體制。是由該算法設計者「Rivest、Shamir、Adleman」的名字構成,(可能看之前還認識「RSA」三個字母,看完後迷糊了。下面將詳細介紹。)
  • 非對稱加密與安全證書看這一篇就懂了
    這類算法主要對原始內容進行置換和替換得到密文,安全性依賴於算法是否外洩;對稱加密算法,加密和解密使用同一個密鑰。對稱加密算法的出現標誌密碼學進入現代密碼學階段,密文的安全性從依賴於算法轉向依賴於密鑰。常見的對稱加密算法有 DES、3DES、AES;非對稱加密算法,加密和解密使用不同的密鑰。
  • 對稱加密及AES加密算法
    ) 4、AES加密的代碼 5、實際開發中使用AES加密需要注意的地方一、對稱加密1、什麼是對稱加密?(記住這個特點,實際使用是會用到的)4、對稱加密的兩大不足密鑰傳輸問題:如上所說,由於對稱加密的加密和解密使用的是同一個密鑰,所以對稱加密的安全性就不僅僅取決於加密算法本身的強度,更取決於密鑰是否被安全的保管,因此加密者如何把密鑰安全的傳遞到解密者手裡,就成了對稱加密面臨的關鍵問題。
  • 區塊鏈丨對稱加密算法
    在前面的文章中,有提到「對稱加密算法」,這是一種相對應用得比較早的加密算法之一,其技術也是比較成熟的。在執行對稱加密時,數據發出方將需要明文(之前的文章中有解釋)和加密密鑰一起輸入至加密算法中進行處理,使之變成更為複雜的加密密文,之後再將密文發布出去。
  • TLS/SSL 協議-非對稱加密(RSA)原理
    前面文章學習過 對稱加密的原理,在通信雙方發送完加密的密文之後,需要發送密鑰給對方才能解密,這就要求發送密鑰的信息通道安全可靠
  • Java加密與解密:消息摘要算法MD5
    MD算法家族的發展史:MD2算法:1989年,著名的非對稱算法RSA發明人之一----麻省理工學院教授羅納德.李維斯特開發了實現MD系統算法的實現通過MessageDigest類來完成的,如需以流的處理方式完成消息摘要,則需使用DigestInputStream和DigestOutputStream。
  • 非對稱加密是什麼?
    區塊鏈主要應用的密碼學算法有兩個部分:一個哈希算法,另一個是非對稱加密。 簡單來說,哈希算法就是一種特殊的函數,不論輸入多長的一串字符,只要通過這個函數都可以得到一個固定長度的輸出值,這就好像身份證號碼一樣,永遠都是十八位而且全國唯一。哈希算法的輸出值就叫做哈希值。