Diffie Hellman密钥交换

adamdudu3 2013-03-08 04:51:59
求一段代码:
我想用Diffie Hellman 来交换128位的密钥,有没有什么好的方法呢?
谢谢!
这里是我的发送端的:
package com.example.try9.Encryption;

import java.security.AlgorithmParameterGenerator;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.KeyAgreement;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;

public class SenderDiffieHellman {
private static KeyAgreement KeyAgree;

public static String Generator() throws InvalidParameterSpecException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException {
//初始化密钥对的参数
DHParameterSpec dhSkipParamSpec;
AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator
.getInstance("DH");
paramGen.init(256);
AlgorithmParameters params = paramGen.generateParameters();
dhSkipParamSpec = (DHParameterSpec) params
.getParameterSpec(DHParameterSpec.class);
//创建一个密钥对
KeyPairGenerator KpairGen = KeyPairGenerator.getInstance("DH");
KpairGen.initialize(dhSkipParamSpec);
KeyPair Kpair = KpairGen.generateKeyPair();

/** 创建密钥协议,产生私钥 */

KeyAgree = KeyAgreement.getInstance("DH");
KeyAgree.init(Kpair.getPrivate());

/** 产生公钥 */

byte[] PubKeyEnc = Kpair.getPublic().getEncoded();
String pubKeyStr=new String(PubKeyEnc);
System.out.println(pubKeyStr);
return pubKeyStr;
}

//产生共享密钥,解析来自另一端的公钥
public static String Parser(String pubKeyStr) throws InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, IllegalStateException{
byte[] pubKeyEnc=pubKeyStr.getBytes();
KeyFactory KeyFac = KeyFactory.getInstance("DH");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKeyEnc);
PublicKey PubKey = KeyFac.generatePublic(x509KeySpec);

KeyAgree.doPhase(PubKey, true);
byte[] SharedSecret = KeyAgree.generateSecret();
String sharedSecretStr=new String (SharedSecret);
return sharedSecretStr;
}
}


这里是我的接收端的:
package com.example.try2.Decryption;

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.KeyAgreement;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;

public class ReceiverDiffieHellman {
// 收到sender的配置之后初始化自己的配置,然后利用这个配置并结合自己的密钥对产生相应的公钥和私钥,
public static String resultPubKsyStr;
public static String sharedSecretStr;

public static void ParserAndGenerator(String pubKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidAlgorithmParameterException, InvalidKeyException {
byte[] pubKeyEnc=pubKeyStr.getBytes();
KeyFactory KeyFac = KeyFactory.getInstance("DH");

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKeyEnc);

PublicKey PubKey = KeyFac.generatePublic(x509KeySpec);
DHParameterSpec dhParamSpec = ((DHPublicKey)PubKey).getParams();

KeyPairGenerator KpairGen = KeyPairGenerator.getInstance("DH");
KpairGen.initialize(dhParamSpec);
KeyPair Kpair = KpairGen.generateKeyPair();
//产生了自己的私钥用于未来的计算
KeyAgreement KeyAgree = KeyAgreement.getInstance("DH");
KeyAgree.init(Kpair.getPrivate());
KeyAgree.doPhase(PubKey, true);
byte[] SharedSecret = KeyAgree.generateSecret();
sharedSecretStr=new String(SharedSecret);
//产生公钥用于屏幕显示
byte[] PubKeyEnc = Kpair.getPublic().getEncoded();
resultPubKsyStr=new String(PubKeyEnc);


System.out.println("ss:"+sharedSecretStr);
System.out.println("re"+resultPubKsyStr);
System.out.println("I'm OK now");

}
}


总是报错:java.security.spec.InvalidKeySpecException: Inappropriate key specification
at com.sun.crypto.provider.DHKeyFactory.engineGeneratePublic(DHKeyFactory.java:87)
at java.security.KeyFactory.generatePublic(Unknown Source)
at test.Generator(test.java:51)
at test.main(test.java:63)

不知道是什么原因?
弄了一天了,谢谢!

--
最新的更新,我发现问题出在将字符数组转成string的问题上面
...全文
197 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
adamdudu3 2013-03-08
  • 打赏
  • 举报
回复
我发现问题很简单: 就是我在把字符串转化成字节数组的时候会出错。 但是很奇怪的是,每个字节数组的每个字节我都赋值正确,而且输出正确,但是当我system out 整个字节数组的时候就错了!这是为什么?

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧