java 中DH的方式实现非对称加密的实例
实现代码:
package com.sahadev; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.Objects; import javax.crypto.Cipher; import javax.crypto.KeyAgreement; import javax.crypto.SecretKey; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.spec.DHParameterSpec; import org.apache.commons.codec.binary.Hex; public class DH { public static String src = "Hello,sahadev!"; public static void main(String[] args) { JDKDH(); } public static void JDKDH() { try { // 初始化发送方密钥 KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH"); senderKeyPairGenerator.initialize(512); KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair(); byte[] senderPublicKey = senderKeyPair.getPublic().getEncoded(); // 初始化接收方的密钥 KeyFactory instance = KeyFactory.getInstance("DH"); X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKey); PublicKey sendPublicKeyTemp = instance.generatePublic(x509EncodedKeySpec); DHParameterSpec dhParameterSpec = ((DHPublicKey) sendPublicKeyTemp).getParams(); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DH"); keyPairGenerator.initialize(dhParameterSpec); // 接收方生成密钥 KeyPair generateKeyPair = keyPairGenerator.generateKeyPair(); byte[] receiverPublicKey = generateKeyPair.getPublic().getEncoded(); PrivateKey receiverPrivateKey = generateKeyPair.getPrivate(); // 接收方密钥构建 KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH"); receiverKeyAgreement.init(receiverPrivateKey); receiverKeyAgreement.doPhase(senderKeyPair.getPublic(), true); // 使用我的密钥和你的公钥生成密钥 SecretKey receiverDesKey = receiverKeyAgreement.generateSecret("DES"); // 发送方密钥构建 KeyFactory keyFactory = KeyFactory.getInstance("DH"); X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(receiverPublicKey); PublicKey receiverPublicKeyTemp = keyFactory.generatePublic(x509EncodedKeySpec2); // 发送方拿到接收方返回的公钥做本地密钥 KeyAgreement senderKeyAgreement = KeyAgreement.getInstance("DH"); senderKeyAgreement.init(senderKeyPair.getPrivate()); senderKeyAgreement.doPhase(receiverPublicKeyTemp, true); // 使用你的密钥我的公钥进行构建 SecretKey senderDesKey = senderKeyAgreement.generateSecret("DES"); // 判断双方的本地密钥是否相同 if (Objects.equals(receiverDesKey, senderDesKey)) { System.out.println("双方密钥相同"); } // 加密 Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, senderDesKey); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("加密结果为 : " + Hex.encodeHexString(result)); // 解密 cipher.init(Cipher.DECRYPT_MODE, senderDesKey); result = cipher.doFinal(result); System.out.println("解密结果为 : " + new String(result)); } catch (Exception e) { e.printStackTrace(); } } }
附上结果:
双方密钥相同 DES : da1cc13d388423e82a110539414b1ec0 解密结果为 : Hello,sahadev!
以上就是DH实现非对称加密的实例,如有 疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍java 中RSA的方式实现非对称加密的实例,包括了java 中RSA的方式实现非对称加密的实例的使用技巧和注意事项,需要的朋友参考一下 java 中RSA的方式实现非对称加密的实例 RSA通俗理解: 你只要去想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签
本文向大家介绍java 非对称加密算法DH实现详解,包括了java 非对称加密算法DH实现详解的使用技巧和注意事项,需要的朋友参考一下 非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥。下面就一起来学习一下吧: 初始化发送方密钥: 初始化接收方密钥: 构建接收方密钥: 构
本文向大家介绍java中以DES的方式实现对称加密并提供密钥的实例,包括了java中以DES的方式实现对称加密并提供密钥的实例的使用技巧和注意事项,需要的朋友参考一下 java中以DES的方式实现对称加密并提供密钥的实例 加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块
本文向大家介绍Java编程实现非对称加密的方法详解,包括了Java编程实现非对称加密的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java编程实现非对称加密的方法。分享给大家供大家参考,具体如下: 对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,
本文向大家介绍C#对称加密与非对称加密实例,包括了C#对称加密与非对称加密实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#对称加密与非对称加密的原理与实现方法,分享给大家供大家参考。具体分析如下: 一、对称加密(Symmetric Cryptography) 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secr
本文向大家介绍ThinkPHP实现的rsa非对称加密类示例,包括了ThinkPHP实现的rsa非对称加密类示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ThinkPHP实现的rsa非对称加密类。分享给大家供大家参考,具体如下: 公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。 私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有