如何在Java中将私钥和公钥组合为共享密钥



我正在阅读关于公钥加密的维基百科(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) 

我的问题是如何在Java中实现combine_keys()方法。

谢谢。

经过一些研究,我提出了使用Java加密包的解决方案。

 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;
}

最后的系统显示,爱丽丝和鲍勃现在有着相同的秘密。

你似乎误解了这篇文章。共享密钥不是由私钥/公钥对生成的。它是一方拥有(或生成,例如在对称密码的密钥的情况下)的任意数据,并通过使用另一方的公钥加密和使用自己的私钥签名的方式,在不安全的数据传输系统(例如电子邮件、大多数网络协议等)上与另一方共享。共享秘密的生成算法可以是任意的,并且不依赖于私钥/公钥。它们只是用来沟通双方之间的秘密。

公钥和私钥从来都不是任意的,而是联合生成的,即它们是一对密钥。然后,您可以使用私钥对使用公钥加密的消息进行解密,或者使用私钥对消息进行签名。Diffie-Hellman的思想是用通信伙伴的公钥加密对称密钥,以便安全传输。通信伙伴可以用她的私钥解密对称密钥。这样,两个通信伙伴共享一个共同的对称密钥,可以用于对称加密。

有一个与此相关的java包,javax.crypto,但我没有使用它的经验。也许API可以帮助您。

假设我的理解是正确的,应该有一个方法combine_keys()

当然有办法。这种方法就是众所周知的Diffie-Hellman方法。有很多Diffie-Hellman的Java实现。例如,看看这里。您的combine()方法被称为sharedKey

给定任意公钥和任意私钥,如何从中生成共享密钥?

假设拥有公钥的一方有一个秘密(例如,由密码字符串伪随机数生成器生成的比特序列)。

  1. 它使用选定的算法和公钥对秘密进行加密。

  2. 它将加密的秘密与私钥一起发送给当事人。

  3. 拥有私钥的一方解密加密的秘密,双方共享该秘密。

重要的是,只有拥有私钥的一方才能进行解密。因此,假设私钥没有泄露并且算法没有被破解,则上述序列还保证即使第三方拦截了加密的秘密,该秘密仍然是秘密。

我想知道如何在Java中实现这一点?

Java中已有一些实现。如果你不能使用其中一个,那么你可以从头开始实现一个发布的算法,并用它来实现上面的共享秘密过程。

你可能需要一个比维基百科更好的信息来源。有关于这个主题的课本。。。

最新更新