Wud*_*ong 7 java cryptography public-key-encryption
我正在阅读关于公钥公钥加密的维基百科(http://en.wikipedia.org/wiki/Public-key_cryptography),其中包含:
在Diffie-Hellman密钥交换方案中,每一方生成公钥/私钥对并分发公钥......在获得彼此公钥的真实副本后,Alice和Bob可以离线计算共享密钥.例如,共享密钥可以用作对称密码的密钥.
我想知道如何在Java中实现这一目标?即,给定一个任意的公钥和一个任意的私钥,如何从中产生一个共享秘密?
为了更清楚:
Alice有一个公钥/私钥对key_pair_alice,
Bob有一个公钥/私钥对key_pair_bob,
假设我的理解是正确的,应该有一个方法combine_keys(),以便:
combine_keys(key_pair_alice.private, key_pair_bob.public) ==
combine_keys(key_pair_alice.public, key_pair_bob.private)
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在Java中实现combine_keys()方法.
谢谢.
经过一番研究,我想出了使用 Java 的 crypto 包的解决方案。
public static void main(String[] args) {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator
.getInstance("DH");
paramGen.init(1024);
// Generate the parameters
AlgorithmParameters params = paramGen.generateParameters();
DHParameterSpec dhSpec = (DHParameterSpec) params
.getParameterSpec(DHParameterSpec.class);
keyGen.initialize(dhSpec);
KeyPair alice_key = keyGen.generateKeyPair();
KeyPair bob_key = keyGen.generateKeyPair();
SecretKey secret_alice = combine(alice_key.getPrivate(),
bob_key.getPublic());
SecretKey secret_bob = combine(bob_key.getPrivate(),
alice_key.getPublic());
System.out.println(Arrays.toString(secret_alice.getEncoded()));
System.out.println(Arrays.toString(secret_bob.getEncoded()));
}
private static SecretKey combine(PrivateKey private1,
PublicKey public1) {
KeyAgreement ka = KeyAgreement.getInstance("DH");
ka.init(private1);
ka.doPhase(public1, true);
SecretKey secretKey = ka.generateSecret("DES");
return secretKey;
}
Run Code Online (Sandbox Code Playgroud)
最后的系统输出显示爱丽丝和鲍勃现在共享相同的秘密。