以下代码串仅供参考
实际开发过程中不采用以下做法
以下做法仅仅是根据imooc的moocer老师的代码结合其他代码的补充
原视频链接
JAVA实现非对称加密 2-3DH算法实现
仅供参考 不喜勿喷 请右上角点X
此类仅仅测试DH算法的单向过程
即
1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留;双方约定数据加密算法;
乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留。
2.甲方使用 私钥、乙方公钥、约定数据加密算法 构建本地密钥,然后通过本地密钥加密数据,发送给乙方加密后的数据;
乙方使用 私钥、甲方公钥、约定数据加密算法 构建本地密钥,然后通过本地密钥对数据解密。
若需要DH算法的详细介绍,我推荐以下自己学习过程中 觉得还不错的文章给大家。
Java 加解密技术系列之 DH
以及
Java加密技术(五)DH
package DH;
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 javax.crypto.Cipher;
import javax.crypto.KeyAgreement;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.interfaces.DHPrivateKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import org.apache.commons.codec.binary.Base64;
import com.sun.org.apache.xalan.internal.utils.Objects;
public class DH {
private static String src = "A Boy Can Do Everything For Girl";
public static void main(String[] args) {
jdkDH();
}//main方法结束
public static void jdkDH(){
try {
//1.初始化发送方密钥 甲方产出一对密钥(公钥、私钥)
//甲方构建密钥对儿,将公钥(senderPublicKeyEnc)公布给乙方,将私钥保留;双方约定数据加密算法
KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");//为指定的算法 DH 创建发送方密钥对生成器 KeyPairGenerator 对象
senderKeyPairGenerator.initialize(512); //为发送方密钥对生成器 KeyPairGenerator对象senderKeyPairGenerator设置生成密钥对的长度
KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair(); //生成一个密钥对KeyPair(密钥对(公钥和私钥)持有者);即 发送方的密钥对持有者senderKeyPair
// 甲方公钥
DHPublicKey senderDhPublicKey = (DHPublicKey) senderKeyPair.getPublic();
// 甲方私钥
DHPrivateKey senderDhPrivateKey = (DHPrivateKey) senderKeyPair.getPrivate();
byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded(); //以byte[]数组的方式存储 发送方的公钥
//2.初始化接收方密钥 乙方依照甲方公钥产生乙方密钥对(公钥、私钥)
//乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留
// 2.1解析甲方公钥
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);//根据发送方公布的公钥创建一个X509EncodedKeySpec对象x509EncodedKeySpec(根据发送方公钥产生的 用于生成接收方密钥的原料)
KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH"); //为指定的算法 DH 创建接收方密钥工厂对象 receiverKeyFactory
//收方密钥工厂对象 receiverKeyFactory使用generatePublic("根据发送方公钥产生,用于生成接收方密钥的原始材料x509EncodedKeySpec")方法
PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);//接收方公钥
// 2.2由甲方公钥构建乙方密钥
DHParameterSpec dhParameterSpec = ((DHPublicKey)receiverPublicKey).getParams();//从发送方解析出来的参数
KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");
receiverKeyPairGenerator.initialize(dhParameterSpec);//初始化receiverKeyPairGenerator
KeyPair receiverKeyPair = receiverKeyPairGenerator.generateKeyPair();//由receiverKeyPairGenerator来生成接收方的 KeyPair 密钥对
// 乙方公钥
DHPublicKey receiverDhPublicKey = (DHPublicKey) receiverKeyPair.getPublic();
// 乙方私钥
DHPrivateKey receiverDhPrivateKey = (DHPrivateKey) receiverKeyPair.getPrivate();
PrivateKey receiverPrivateKey = receiverKeyPair.getPrivate();//接收方私钥
byte[] receiverPublicKeyEnc = receiverKeyPair.getPublic().getEncoded(); //以byte[]数组的方式存储 接收方的公钥
//3.构建密钥
//生成接收方的本地密钥
KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");
receiverKeyAgreement.init(receiverPrivateKey);
receiverKeyAgreement.doPhase(receiverPublicKey, true);
//3.1用发送方公钥来生成接收方的本地密钥receiverSecretKey
SecretKey receiverSecretKey = receiverKeyAgreement.generateSecret("DES");
//生成发送方的本地密钥senderrSecretKey
//重新初始化x509EncodedKeySpec
KeyFactory senderKeyFactory = KeyFactory.getInstance("DH");
x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc);//根据接收方公布的公钥创建一个X509EncodedKeySpec对象x509EncodedKeySpec(根据接收方公钥产生的 用于生成发送方密钥的原料)
PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec);
KeyAgreement senderKeyAgreement = KeyAgreement.getInstance("DH");
senderKeyAgreement.init(senderKeyPair.getPrivate());
senderKeyAgreement.doPhase(senderPublicKey, true);
SecretKey senderSecretKey = senderKeyAgreement.generateSecret("DES");
//比较发送方和接收方的本地密钥是否相同
if(Objects.equals(senderSecretKey, receiverSecretKey)){
System.out.println("双方本地密钥相同");
}
//4.发送方加密
Cipher senderCipher = Cipher.getInstance("DES");
senderCipher.init(Cipher.ENCRYPT_MODE, senderSecretKey);
byte[] senderEncodeResult = senderCipher.doFinal(src.getBytes());
System.out.println("jdk dh encrypt:"+Base64.encodeBase64String(senderEncodeResult));
//4.接收方解密
Cipher receiverCipher = Cipher.getInstance("DES");
receiverCipher.init(Cipher.DECRYPT_MODE, receiverSecretKey);
byte[] receiverDecodeResult = receiverCipher.doFinal(senderEncodeResult);
System.out.println("jdk dh decrypt:"+new String(receiverDecodeResult));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//jdkDH()方法结束
}//DH类结束