我看錯了嗎?還是我理解有誤?
1、甲方(消息發(fā)送方,下同)構(gòu)建密鑰對(公鑰+私鑰),甲方公布公鑰給乙方(消息接收方,下同) 2、乙方以甲方發(fā)送過來的公鑰作為參數(shù)構(gòu)造密鑰對(公鑰+私鑰),將構(gòu)造出來的公鑰公布給甲方 3、甲方用“甲方的私鑰+乙方的公鑰”構(gòu)造本地密鑰 4、乙方用“乙方的私鑰+甲方的公鑰”構(gòu)造本地的密鑰 不應(yīng)該是這種方式嗎?但是我看老師的代碼,用的是甲方公鑰+甲方密鑰構(gòu)造本地的密鑰,乙方公鑰+乙方密鑰構(gòu)造本地的密鑰,是我看錯了嗎???????
2018-04-18
1.發(fā)送方構(gòu)建公鑰私鑰。
2.發(fā)送方發(fā)布發(fā)送方公鑰。
3.接收方接收發(fā)送方公鑰構(gòu)建接收方公鑰私鑰。
4.接收方發(fā)布接收方公鑰。
5.發(fā)送方通過發(fā)送方的私鑰和接收方的公鑰構(gòu)建對稱加密秘鑰用于加密。
6.接收方通過接收方的私鑰和發(fā)送方的公鑰構(gòu)建對稱加密秘鑰用于解密。
7.發(fā)送方通過秘鑰加密數(shù)據(jù)并發(fā)送。
8.接收方接收數(shù)據(jù)并通過秘鑰解密數(shù)據(jù)。
我稍微整理了下
public?static?void?jdkDHFlow()?throws?Exception?{ ????//1.發(fā)送方構(gòu)建公鑰私鑰 ????KeyPair?senderKeyPair?=?jdkSenderPublicKey(); ????//2.發(fā)送方發(fā)布公鑰 ????byte[]?senderPublicKeyEncode?=?senderKeyPair.getPublic().getEncoded(); ????//3.接收方構(gòu)建公鑰私鑰->接收方通過發(fā)送方公鑰構(gòu)建公鑰私鑰 ????KeyPair?receiverKeyPair?=?jdkreceiverPublicKey(senderPublicKeyEncode); ????//4.接收方發(fā)布公鑰 ????byte[]?receiverPublicKeyEncode?=?receiverKeyPair.getPublic().getEncoded(); ????//5.發(fā)送方構(gòu)建對稱加密的秘鑰->依據(jù)接收方公鑰和自己的公鑰私鑰構(gòu)建 ????SecretKey?senderDesKey?=?jdkGetSecretKey(senderKeyPair,receiverPublicKeyEncode); ????//6.接收方構(gòu)建對稱加密秘鑰->依據(jù)發(fā)送方公鑰和接收方公鑰撕咬構(gòu)建 ????SecretKey?receiverDesKey?=?jdkGetSecretKey(receiverKeyPair,senderPublicKeyEncode); ????//對比雙方對稱加密秘鑰是否安相同?查看是否測試成功 ????if(Objects.equals(receiverDesKey,senderDesKey)){ ????????System.out.println("雙方秘鑰相同"); ????} ????//7.發(fā)送方加密 ????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)); } /** ??*?發(fā)送方構(gòu)建發(fā)送方公鑰 ??*?@return?構(gòu)建完成的公鑰 ??*/ ?public?static?KeyPair?jdkSenderPublicKey()?throws?NoSuchAlgorithmException?{ ?????//1.初始化發(fā)送方秘鑰 ?????KeyPairGenerator?senderKeyPairGenerator?=?KeyPairGenerator.getInstance("DH"); ?????senderKeyPairGenerator.initialize(512); ?????//生成秘鑰 ?????KeyPair?senderKeyPair?=?senderKeyPairGenerator.generateKeyPair(); ?????return??senderKeyPair; ?} ?/** ??*?依據(jù)發(fā)送方公鑰生成接收方公鑰 ??*?@param?senderPublicKey?發(fā)送方公鑰 ??*?@return?接收方公鑰 ??*/ ?public?static?KeyPair?jdkreceiverPublicKey(byte[]?senderPublicKey)?throws?Exception?{ ?????KeyFactory?receiverKeyFactory?=?KeyFactory.getInstance("DH"); ?????X509EncodedKeySpec?x509EncodedKeySpec?=?new?X509EncodedKeySpec(senderPublicKey); ?????PublicKey?receiverPublicKey?=?receiverKeyFactory.generatePublic(x509EncodedKeySpec); ?????//使用和發(fā)送方一樣的參數(shù)初始化 ?????DHParameterSpec?dhParameterSpec?=?((DHPublicKey)?receiverPublicKey).getParams(); ?????KeyPairGenerator?receiverKeyPairGenerator?=?KeyPairGenerator.getInstance("DH"); ?????//發(fā)送方公鑰解析出來的dhParameterSpec ?????receiverKeyPairGenerator.initialize(dhParameterSpec); ?????KeyPair?receiverKeyPair?=?receiverKeyPairGenerator.generateKeyPair(); ?????return?receiverKeyPair; ?} ?/** ??*?自己的公鑰私鑰與對方的公鑰構(gòu)建?對稱秘鑰 ??*?@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.發(fā)送方構(gòu)建公鑰私鑰。
2.發(fā)送方發(fā)布發(fā)送方公鑰。
3.接收方接收發(fā)送方公鑰構(gòu)建接收方公鑰私鑰。
4.接收方發(fā)布接收方公鑰。
5.發(fā)送方通過發(fā)送方的私鑰和接收方的公鑰構(gòu)建對稱加密秘鑰用于加密。
6.接收方通過接收方的私鑰和發(fā)送方的公鑰構(gòu)建對稱加密秘鑰用于解密。
7.發(fā)送方通過秘鑰加密數(shù)據(jù)并發(fā)送。
8.接收方接收數(shù)據(jù)并通過秘鑰解密數(shù)據(jù)。
我稍微整理了下
public?static?void?jdkDHFlow()?throws?Exception?{ ????//1.發(fā)送方構(gòu)建公鑰私鑰 ????KeyPair?senderKeyPair?=?jdkSenderPublicKey(); ????//2.發(fā)送方發(fā)布公鑰 ????byte[]?senderPublicKeyEncode?=?senderKeyPair.getPublic().getEncoded(); ????//3.接收方構(gòu)建公鑰私鑰->接收方通過發(fā)送方公鑰構(gòu)建公鑰私鑰 ????KeyPair?receiverKeyPair?=?jdkreceiverPublicKey(senderPublicKeyEncode); ????//4.接收方發(fā)布公鑰 ????byte[]?receiverPublicKeyEncode?=?receiverKeyPair.getPublic().getEncoded(); ????//5.發(fā)送方構(gòu)建對稱加密的秘鑰->依據(jù)接收方公鑰和自己的公鑰私鑰構(gòu)建 ????SecretKey?senderDesKey?=?jdkGetSecretKey(senderKeyPair,receiverPublicKeyEncode); ????//6.接收方構(gòu)建對稱加密秘鑰->依據(jù)發(fā)送方公鑰和接收方公鑰撕咬構(gòu)建 ????SecretKey?receiverDesKey?=?jdkGetSecretKey(receiverKeyPair,senderPublicKeyEncode); ????//對比雙方對稱加密秘鑰是否安相同?查看是否測試成功 ????if(Objects.equals(receiverDesKey,senderDesKey)){ ????????System.out.println("雙方秘鑰相同"); ????} ????//7.發(fā)送方加密 ????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)); } /** ??*?發(fā)送方構(gòu)建發(fā)送方公鑰 ??*?@return?構(gòu)建完成的公鑰 ??*/ ?public?static?KeyPair?jdkSenderPublicKey()?throws?NoSuchAlgorithmException?{ ?????//1.初始化發(fā)送方秘鑰 ?????KeyPairGenerator?senderKeyPairGenerator?=?KeyPairGenerator.getInstance("DH"); ?????senderKeyPairGenerator.initialize(512); ?????//生成秘鑰 ?????KeyPair?senderKeyPair?=?senderKeyPairGenerator.generateKeyPair(); ?????return??senderKeyPair; ?} ?/** ??*?依據(jù)發(fā)送方公鑰生成接收方公鑰 ??*?@param?senderPublicKey?發(fā)送方公鑰 ??*?@return?接收方公鑰 ??*/ ?public?static?KeyPair?jdkreceiverPublicKey(byte[]?senderPublicKey)?throws?Exception?{ ?????KeyFactory?receiverKeyFactory?=?KeyFactory.getInstance("DH"); ?????X509EncodedKeySpec?x509EncodedKeySpec?=?new?X509EncodedKeySpec(senderPublicKey); ?????PublicKey?receiverPublicKey?=?receiverKeyFactory.generatePublic(x509EncodedKeySpec); ?????//使用和發(fā)送方一樣的參數(shù)初始化 ?????DHParameterSpec?dhParameterSpec?=?((DHPublicKey)?receiverPublicKey).getParams(); ?????KeyPairGenerator?receiverKeyPairGenerator?=?KeyPairGenerator.getInstance("DH"); ?????//發(fā)送方公鑰解析出來的dhParameterSpec ?????receiverKeyPairGenerator.initialize(dhParameterSpec); ?????KeyPair?receiverKeyPair?=?receiverKeyPairGenerator.generateKeyPair(); ?????return?receiverKeyPair; ?} ?/** ??*?自己的公鑰私鑰與對方的公鑰構(gòu)建?對稱秘鑰 ??*?@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; ?}