我看錯了嗎?還是我理解有誤?
1、甲方(消息發送方,下同)構建密鑰對(公鑰+私鑰),甲方公布公鑰給乙方(消息接收方,下同) 2、乙方以甲方發送過來的公鑰作為參數構造密鑰對(公鑰+私鑰),將構造出來的公鑰公布給甲方 3、甲方用“甲方的私鑰+乙方的公鑰”構造本地密鑰 4、乙方用“乙方的私鑰+甲方的公鑰”構造本地的密鑰 不應該是這種方式嗎?但是我看老師的代碼,用的是甲方公鑰+甲方密鑰構造本地的密鑰,乙方公鑰+乙方密鑰構造本地的密鑰,是我看錯了嗎???????
1、甲方(消息發送方,下同)構建密鑰對(公鑰+私鑰),甲方公布公鑰給乙方(消息接收方,下同) 2、乙方以甲方發送過來的公鑰作為參數構造密鑰對(公鑰+私鑰),將構造出來的公鑰公布給甲方 3、甲方用“甲方的私鑰+乙方的公鑰”構造本地密鑰 4、乙方用“乙方的私鑰+甲方的公鑰”構造本地的密鑰 不應該是這種方式嗎?但是我看老師的代碼,用的是甲方公鑰+甲方密鑰構造本地的密鑰,乙方公鑰+乙方密鑰構造本地的密鑰,是我看錯了嗎???????
2018-04-07
舉報
2018-04-18
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; ?}2018-04-18
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; ?}