Java中加密算法介绍及其实现( 六 )


另一方面 , 甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签 。
甲方只能用其专用密钥解密由其公用密钥加密后的任何信息 。非对称加密算法的保密性比较好 , 它消除了最终用户交换密钥的需要 。
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂 , 而使得加密解密速度没有对称加密解密的速度快 。对称密码体制中只有一种密钥 , 并且是非公开的 , 如果要解密就得让对方知道密钥 。所以保证其安全性就是保证密钥的安全 , 而非对称密钥体制有两种密钥 , 其中一个是公开的 , 这样就可以不需要像对称密码那样传输对方的密钥了 。这样安全性就大了很多 。
特点:加密等级高 , 传输安全
非对称加密算法实现 DH秘钥交换算法
解决对称加密传输安全的问题、构建本地秘钥 。
秘钥长度默认工作模式填充方式实现方
512~1024位
1024位


JDK
流程

Java中加密算法介绍及其实现

文章插图
1.发送方构建公钥私钥 。
2.发送方发布发送方公钥 。
3.接收方接收发送方公钥构建接收方公钥私钥 。
4.接收方发布接收方公钥 。
5.发送方通过发送方的私钥和接收方的公钥构建对称加密秘钥用于加密 。
6.接收方通过接收方的私钥和发送方的公钥构建对称加密秘钥用于解密 。
7.发送方通过秘钥加密数据并发送 。
8.接收方接收数据并通过秘钥解密数据 。
1.初始化发送方秘钥
2.初始化接收方秘钥
3.秘钥构建
4.加密、解密
//流程实现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();returnsenderKeyPair;}/*** 依据发送方公钥生成接收方公钥* @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");//发送方公钥解析出来的dhParameterSpecreceiverKeyPairGenerator.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");returnsecretKey;}