博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以DH的方式实现非对称加密
阅读量:6550 次
发布时间:2019-06-24

本文共 2964 字,大约阅读时间需要 9 分钟。

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!

转载地址:http://kffco.baihongyu.com/

你可能感兴趣的文章
怎样使用原型设计中的组件样式功能
查看>>
python threading
查看>>
谷安天下2013年6月CISA考前辅导 第一季
查看>>
在普通台式机上搭建服务器虚拟化架构Esxi平台
查看>>
电话线路 30B+D 名词解释
查看>>
吉炬消费系统软件输入密码后无法打开软件界面故障处理
查看>>
Hibernate学习系列————注解一对多双向实例
查看>>
Cannot load from mysql.proc
查看>>
汇编字符串拷贝
查看>>
Lambda的前世今生
查看>>
TCP/IP模型简介和/etc/hosts文件说明
查看>>
UIButton常用属性
查看>>
主键自增归0
查看>>
mysql之 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
查看>>
如何批量修改文件后缀的方法
查看>>
Effective STL 笔记
查看>>
[LeetCode] 1. Two Sum
查看>>
POJ2538 ZOJ1884 UVA10082 WERTYU【输入输出】
查看>>
HDU5620 KK's Steel(C++语言版)
查看>>
旋转卡壳
查看>>