JAVA加密算法實(shí)密鑰一致協(xié)議代碼示例
密鑰一致協(xié)議是由公開密鑰密碼體制的奠基人 Diffie 和 Hellman 所提出的一種思想。
代表:指數(shù)密鑰一致協(xié)議 (Exponential Key Agreement Protocol)
使用流程介紹:
甲方構(gòu)建密鑰對,將公鑰公布給乙方,將私鑰保留;雙方約定數(shù)據(jù)加密算法;乙方通過甲方公鑰構(gòu)建密鑰對,將公鑰公布給甲方,將私鑰保留。
甲方使用私鑰、乙方公鑰、約定數(shù)據(jù)加密算法構(gòu)建本地密鑰,然后通過本地密鑰加密數(shù)據(jù),發(fā)送給乙方加密后的數(shù)據(jù);乙方使用私鑰、甲方公鑰、約定數(shù)據(jù)加密算法構(gòu)建本地密鑰,然后通過本地密鑰對數(shù)據(jù)解密。
乙方使用私鑰、甲方公鑰、約定數(shù)據(jù)加密算法構(gòu)建本地密鑰,然后通過本地密鑰加密數(shù)據(jù),發(fā)送給甲方加密后的數(shù)據(jù);甲方使用私鑰、乙方公鑰、約定數(shù)據(jù)加密算法構(gòu)建本地密鑰,然后通過本地密鑰對數(shù)據(jù)解密。
不單單是甲乙雙方兩方,可以擴(kuò)展為多方共享數(shù)據(jù)通訊,這樣就完成了網(wǎng)絡(luò)交互數(shù)據(jù)的安全通訊!
參考示例:
package test;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import javax.crypto.KeyAgreement;
import javax.crypto.SecretKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
public class DHKey {
public static void main(String argv[]) {
try {
DHKey my = new DHKey();
my.run();
} catch (Exception e) {
System.err.println(e);
}
}
private void run() throws Exception {
// A 構(gòu)建密鑰對,公鑰給B
Security.addProvider(new com.sun.crypto.provider.SunJCE());
KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH");
aliceKpairGen.initialize(512);
KeyPair aliceKpair = aliceKpairGen.generateKeyPair();
byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded(); // 公開密鑰
// B 根據(jù)A的公鑰構(gòu)建自己的密鑰對,同時(shí)把自己生成的公鑰給A,通過A的公鑰和自己的私鑰構(gòu)建DES的密鑰
KeyFactory bobKeyFac = KeyFactory.getInstance("DH");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(alicePubKeyEnc);
PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);
DHParameterSpec dhParamSpec = ((DHPublicKey) alicePubKey).getParams();
KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance("DH");
bobKpairGen.initialize(dhParamSpec);
KeyPair bobKpair = bobKpairGen.generateKeyPair();
KeyAgreement bobKeyAgree = KeyAgreement.getInstance("DH");
bobKeyAgree.init(bobKpair.getPrivate());
bobKeyAgree.doPhase(alicePubKey, true);
SecretKey bobDesKey = bobKeyAgree.generateSecret("DES");
byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();
// A 通過本地密鑰和A的公鑰構(gòu)建DES密鑰,這里還做一個(gè)驗(yàn)證
KeyFactory aliceKeyFac = KeyFactory.getInstance("DH");
x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);
PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);
KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("DH");
aliceKeyAgree.init(aliceKpair.getPrivate()); // 秘密密鑰
aliceKeyAgree.doPhase(bobPubKey, true);
SecretKey aliceDesKey = aliceKeyAgree.generateSecret("DES");
if (aliceDesKey.equals(bobDesKey))
System.out.println("A 和 B 的公鑰 相同");
else
System.out.println("A 和 B 的公鑰 不同");
// B 通過密鑰加密數(shù)據(jù)
Cipher bobCipher = Cipher.getInstance("DES");
bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);
String bobinfo = "這是B的機(jī)密信息";
System.out.println("B 加密前原文 :" + bobinfo);
byte[] cleartext = bobinfo.getBytes();
byte[] ciphertext = bobCipher.doFinal(cleartext);
// A 通過密鑰解密數(shù)據(jù)
Cipher aliceCipher = Cipher.getInstance("DES");
aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);
byte[] recovered = aliceCipher.doFinal(ciphertext);
System.out.println("A解密 B 的信息 :" + (new String(recovered)));
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java 非對稱加密算法DH實(shí)現(xiàn)詳解
- java 非對稱加密算法RSA實(shí)現(xiàn)詳解
- JAVA加密算法- 非對稱加密算法(DH,RSA)的詳細(xì)介紹
- Java 實(shí)現(xiàn)對稱加密算法
- JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解
- Java sm3加密算法的實(shí)現(xiàn)
- Java對稱加密算法DES實(shí)例詳解
- java實(shí)現(xiàn)可逆加密算法
- java實(shí)現(xiàn)AES可逆加密算法
- Java實(shí)現(xiàn)的Base64加密算法示例
- Java實(shí)現(xiàn)的對稱加密算法3DES定義與用法示例
- Java語言實(shí)現(xiàn)Blowfish加密算法完整代碼分享
- Java常用加密算法實(shí)例總結(jié)
- Java 實(shí)現(xiàn)常見的非對稱加密算法
相關(guān)文章
Java中Process類的使用與注意事項(xiàng)說明
這篇文章主要介紹了Java中Process類的使用與注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring-boot原理及spring-boot-starter實(shí)例和代碼
spring-boot的starter是一個(gè)通過maven完成自包含并通過annotation配置使得可被spring上下文發(fā)現(xiàn)并實(shí)例化的一個(gè)可插拔的組件或服務(wù)。這篇文章主要介紹了Spring-boot原理及spring-boot-starter實(shí)例和代碼 ,需要的朋友可以參考下2019-06-06
Idea中如何查看SpringSecurity各Filter信息
這篇文章主要介紹了Idea中如何查看SpringSecurity各Filter信息,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Springboot整合mybatis-plus使用pageHelper進(jìn)行分頁(使用步驟)
PageHelper是一個(gè)MyBatis分頁插件,可以方便地實(shí)現(xiàn)數(shù)據(jù)庫查詢結(jié)果的分頁功能,在Maven或Gradle項(xiàng)目中引入依賴,并在配置文件中進(jìn)行配置,本文給大家介紹Springboot整合mybatis-plus使用pageHelper進(jìn)行分頁,感興趣的朋友跟隨小編一起看看吧2024-11-11

