亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

我看錯了嗎?還是我理解有誤?

1、甲方(消息發送方,下同)構建密鑰對(公鑰+私鑰),甲方公布公鑰給乙方(消息接收方,下同) 2、乙方以甲方發送過來的公鑰作為參數構造密鑰對(公鑰+私鑰),將構造出來的公鑰公布給甲方 3、甲方用“甲方的私鑰+乙方的公鑰”構造本地密鑰 4、乙方用“乙方的私鑰+甲方的公鑰”構造本地的密鑰 不應該是這種方式嗎?但是我看老師的代碼,用的是甲方公鑰+甲方密鑰構造本地的密鑰,乙方公鑰+乙方密鑰構造本地的密鑰,是我看錯了嗎???????

正在回答

2 回答

1.發送方構建公鑰私鑰。

2.發送方發布發送方公鑰。

3.接收方接收發送方公鑰構建接收方公鑰私鑰。

4.接收方發布接收方公鑰。

5.發送方通過發送方的私鑰和接收方的公鑰構建對稱加密秘鑰用于加密。

6.接收方通過接收方的私鑰和發送方的公鑰構建對稱加密秘鑰用于解密。

7.發送方通過秘鑰加密數據并發送。

8.接收方接收數據并通過秘鑰解密數據。

我稍微整理了下

public?static?void?jdkDHFlow()?throws?Exception?{
????//1.發送方構建公鑰私鑰
????KeyPair?senderKeyPair?=?jdkSenderPublicKey();
????//2.發送方發布公鑰
????byte[]?senderPublicKeyEncode?=?senderKeyPair.getPublic().getEncoded();
????//3.接收方構建公鑰私鑰->接收方通過發送方公鑰構建公鑰私鑰
????KeyPair?receiverKeyPair?=?jdkreceiverPublicKey(senderPublicKeyEncode);
????//4.接收方發布公鑰
????byte[]?receiverPublicKeyEncode?=?receiverKeyPair.getPublic().getEncoded();
????//5.發送方構建對稱加密的秘鑰->依據接收方公鑰和自己的公鑰私鑰構建
????SecretKey?senderDesKey?=?jdkGetSecretKey(senderKeyPair,receiverPublicKeyEncode);
????//6.接收方構建對稱加密秘鑰->依據發送方公鑰和接收方公鑰撕咬構建
????SecretKey?receiverDesKey?=?jdkGetSecretKey(receiverKeyPair,senderPublicKeyEncode);
????//對比雙方對稱加密秘鑰是否安相同?查看是否測試成功
????if(Objects.equals(receiverDesKey,senderDesKey)){
????????System.out.println("雙方秘鑰相同");
????}
????//7.發送方加密
????Cipher?cipher?=?Cipher.getInstance("DES");
????cipher.init(Cipher.ENCRYPT_MODE,senderDesKey);
????byte[]?result?=?cipher.doFinal(BASE_STRING.getBytes());
????System.out.println("JDK?DH?加密:"+?Base64.encodeBase64String(result));
????//8.接收方解密
????cipher.init(Cipher.DECRYPT_MODE,receiverDesKey);
????result?=?cipher.doFinal(result);
????System.out.println("JDK?DH?解密:"+new?String(result));
}

/**
??*?發送方構建發送方公鑰
??*?@return?構建完成的公鑰
??*/
?public?static?KeyPair?jdkSenderPublicKey()?throws?NoSuchAlgorithmException?{
?????//1.初始化發送方秘鑰
?????KeyPairGenerator?senderKeyPairGenerator?=?KeyPairGenerator.getInstance("DH");
?????senderKeyPairGenerator.initialize(512);
?????//生成秘鑰
?????KeyPair?senderKeyPair?=?senderKeyPairGenerator.generateKeyPair();
?????return??senderKeyPair;
?}

?/**
??*?依據發送方公鑰生成接收方公鑰
??*?@param?senderPublicKey?發送方公鑰
??*?@return?接收方公鑰
??*/
?public?static?KeyPair?jdkreceiverPublicKey(byte[]?senderPublicKey)?throws?Exception?{
?????KeyFactory?receiverKeyFactory?=?KeyFactory.getInstance("DH");
?????X509EncodedKeySpec?x509EncodedKeySpec?=?new?X509EncodedKeySpec(senderPublicKey);
?????PublicKey?receiverPublicKey?=?receiverKeyFactory.generatePublic(x509EncodedKeySpec);
?????//使用和發送方一樣的參數初始化
?????DHParameterSpec?dhParameterSpec?=?((DHPublicKey)?receiverPublicKey).getParams();
?????KeyPairGenerator?receiverKeyPairGenerator?=?KeyPairGenerator.getInstance("DH");
?????//發送方公鑰解析出來的dhParameterSpec
?????receiverKeyPairGenerator.initialize(dhParameterSpec);
?????KeyPair?receiverKeyPair?=?receiverKeyPairGenerator.generateKeyPair();
?????return?receiverKeyPair;
?}

?/**
??*?自己的公鑰私鑰與對方的公鑰構建?對稱秘鑰
??*?@param?keyPair?自己秘鑰對
??*?@param?publicKey?對方公鑰
??*?@return?本地對稱加密秘鑰
??*/
?public?static?SecretKey?jdkGetSecretKey(KeyPair?keyPair,byte[]?publicKey)?throws?Exception?{
?????KeyFactory?keyFactory?=?KeyFactory.getInstance("DH");
?????X509EncodedKeySpec?x509EncodedKeySpec?=?new?X509EncodedKeySpec(publicKey);
?????PublicKey?senderPublicKey?=?keyFactory.generatePublic(x509EncodedKeySpec);
?????KeyAgreement?keyAgreement?=?KeyAgreement.getInstance("DH");
?????keyAgreement.init(keyPair.getPrivate());
?????keyAgreement.doPhase(senderPublicKey,true);
?????SecretKey?secretKey?=?keyAgreement.generateSecret("DES");
?????return??secretKey;
?}


1 回復 有任何疑惑可以回復我~
#1

_Alance

有幾個錯別字不好意思啊。
2018-04-18 回復 有任何疑惑可以回復我~
#2

慕粉2333001784 提問者

非常感謝!
2018-05-19 回復 有任何疑惑可以回復我~

1.發送方構建公鑰私鑰。

2.發送方發布發送方公鑰。

3.接收方接收發送方公鑰構建接收方公鑰私鑰。

4.接收方發布接收方公鑰。

5.發送方通過發送方的私鑰和接收方的公鑰構建對稱加密秘鑰用于加密。

6.接收方通過接收方的私鑰和發送方的公鑰構建對稱加密秘鑰用于解密。

7.發送方通過秘鑰加密數據并發送。

8.接收方接收數據并通過秘鑰解密數據。

我稍微整理了下

public?static?void?jdkDHFlow()?throws?Exception?{
????//1.發送方構建公鑰私鑰
????KeyPair?senderKeyPair?=?jdkSenderPublicKey();
????//2.發送方發布公鑰
????byte[]?senderPublicKeyEncode?=?senderKeyPair.getPublic().getEncoded();
????//3.接收方構建公鑰私鑰->接收方通過發送方公鑰構建公鑰私鑰
????KeyPair?receiverKeyPair?=?jdkreceiverPublicKey(senderPublicKeyEncode);
????//4.接收方發布公鑰
????byte[]?receiverPublicKeyEncode?=?receiverKeyPair.getPublic().getEncoded();
????//5.發送方構建對稱加密的秘鑰->依據接收方公鑰和自己的公鑰私鑰構建
????SecretKey?senderDesKey?=?jdkGetSecretKey(senderKeyPair,receiverPublicKeyEncode);
????//6.接收方構建對稱加密秘鑰->依據發送方公鑰和接收方公鑰撕咬構建
????SecretKey?receiverDesKey?=?jdkGetSecretKey(receiverKeyPair,senderPublicKeyEncode);
????//對比雙方對稱加密秘鑰是否安相同?查看是否測試成功
????if(Objects.equals(receiverDesKey,senderDesKey)){
????????System.out.println("雙方秘鑰相同");
????}
????//7.發送方加密
????Cipher?cipher?=?Cipher.getInstance("DES");
????cipher.init(Cipher.ENCRYPT_MODE,senderDesKey);
????byte[]?result?=?cipher.doFinal(BASE_STRING.getBytes());
????System.out.println("JDK?DH?加密:"+?Base64.encodeBase64String(result));
????//8.接收方解密
????cipher.init(Cipher.DECRYPT_MODE,receiverDesKey);
????result?=?cipher.doFinal(result);
????System.out.println("JDK?DH?解密:"+new?String(result));
}

/**
??*?發送方構建發送方公鑰
??*?@return?構建完成的公鑰
??*/
?public?static?KeyPair?jdkSenderPublicKey()?throws?NoSuchAlgorithmException?{
?????//1.初始化發送方秘鑰
?????KeyPairGenerator?senderKeyPairGenerator?=?KeyPairGenerator.getInstance("DH");
?????senderKeyPairGenerator.initialize(512);
?????//生成秘鑰
?????KeyPair?senderKeyPair?=?senderKeyPairGenerator.generateKeyPair();
?????return??senderKeyPair;
?}

?/**
??*?依據發送方公鑰生成接收方公鑰
??*?@param?senderPublicKey?發送方公鑰
??*?@return?接收方公鑰
??*/
?public?static?KeyPair?jdkreceiverPublicKey(byte[]?senderPublicKey)?throws?Exception?{
?????KeyFactory?receiverKeyFactory?=?KeyFactory.getInstance("DH");
?????X509EncodedKeySpec?x509EncodedKeySpec?=?new?X509EncodedKeySpec(senderPublicKey);
?????PublicKey?receiverPublicKey?=?receiverKeyFactory.generatePublic(x509EncodedKeySpec);
?????//使用和發送方一樣的參數初始化
?????DHParameterSpec?dhParameterSpec?=?((DHPublicKey)?receiverPublicKey).getParams();
?????KeyPairGenerator?receiverKeyPairGenerator?=?KeyPairGenerator.getInstance("DH");
?????//發送方公鑰解析出來的dhParameterSpec
?????receiverKeyPairGenerator.initialize(dhParameterSpec);
?????KeyPair?receiverKeyPair?=?receiverKeyPairGenerator.generateKeyPair();
?????return?receiverKeyPair;
?}

?/**
??*?自己的公鑰私鑰與對方的公鑰構建?對稱秘鑰
??*?@param?keyPair?自己秘鑰對
??*?@param?publicKey?對方公鑰
??*?@return?本地對稱加密秘鑰
??*/
?public?static?SecretKey?jdkGetSecretKey(KeyPair?keyPair,byte[]?publicKey)?throws?Exception?{
?????KeyFactory?keyFactory?=?KeyFactory.getInstance("DH");
?????X509EncodedKeySpec?x509EncodedKeySpec?=?new?X509EncodedKeySpec(publicKey);
?????PublicKey?senderPublicKey?=?keyFactory.generatePublic(x509EncodedKeySpec);
?????KeyAgreement?keyAgreement?=?KeyAgreement.getInstance("DH");
?????keyAgreement.init(keyPair.getPrivate());
?????keyAgreement.doPhase(senderPublicKey,true);
?????SecretKey?secretKey?=?keyAgreement.generateSecret("DES");
?????return??secretKey;
?}


1 回復 有任何疑惑可以回復我~
#1

飛天MoMo

感謝總結,學習到了。只是有個小失誤,方法jdkGetSecretKey中前三行多余了。
2018-07-06 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

我看錯了嗎?還是我理解有誤?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號