我想让两方使用他们的公钥和私钥就同一个密钥达成一致。我不希望他们有任何互动。因此,我认为method(A.privKey, B.pubKey)
提供与method(B.privKey, A.pubKey)
当我使用KeyPairGenerator.getInstance("RSA")
如果是这样,我该怎么做?或者我需要使用KeyPairGenerator.getInstance("DH")
吗?
我在网上搜索过,似乎无法找到答案。
答案 0 :(得分:4)
Diffie-Hellman和RSA背后的数学是不同的,因此RSA密钥不适用于DH。
DH是密钥交换,它产生一个共享密钥,给出两个密钥对。它不直接加密数据。 (但通过将DH与对称加密相结合,可以很容易地构建加密)。
双方就一个群体达成一致,最简单的情况是由g
和p
定义,其中p
是一个安全的素数。
私钥只是一个数字a
,相应的公钥A
是g^a mod p
。由于取幂是可交换的,因此可以计算共享密钥,所以
A^b = (g^a)^b = g^(ab) = (g^b)^a = B^a
为此,两个密钥对都需要使用同一个组。实现这一目标的最简单方法是选择一个特定的组并将其硬编码到您的协议/应用程序中。
RSA使用公钥加密消息m
,生成密文c
。所以它只使用一个密钥对,即接收者的密钥对。
私钥是固定的指数e
(通常为65537)和一对素数p
和q
。
相应的公钥为e
,是素数n = p * q
的乘积。
加密是通过计算c = m^e mod n
进行的,只有当您知道p
和q
时才会受到加密,但如果您只知道n
则不会加以加密。
您可以使用RSA生成共享密钥,方法是生成随机密钥作为发件人,并使用收件人的公钥对其进行加密。这适用于在没有交互的情况下将消息加密到收件人。但它不会对发件人进行身份验证,因为他们可以控制共享密钥。因此,如果您无法使用RSA来实现非交互式拒绝身份验证。但是您可以使用RSA签署邮件(但不要使用相同的密钥对进行签名和加密),从而为您提供不可否认的身份验证。
答案 1 :(得分:1)
由于RSA实际上并不生成公钥和私钥对,而是一对反键,您可以使用RSA密钥进行交换,生成一对密钥,是逆,但每一方只知道它的一部分。它依赖于以下事实:不仅来自同一对的RSA密钥通勤,而且它们也可以通过不同的对进行通信。我今天早上刚写了一些代码来演示它。
alice -> bob: alice.pub
bob -> alice: bob.pub
alice: a = (alice.priv * bob.pub)
bob: b = (bob.priv * alice.pub)
向上和向下是反向键。这是一个协商的非对称密钥。爱丽丝可以申请,而鲍勃可以申请。当它们都被应用时,它们会被取消。所以这是不对称的密钥协议。如果我们尝试使用RSA,alice或bob会知道这两个键。但有了这个,Bob的消息肯定是由Alice创建的,反之亦然。
我在要求应用程序为我们加密密钥的情况下发现了这一点 - 在它检查我们已获得授权后,以及应用程序以后无法解密密钥 - 只有被授权者。即使被授权者可以获得明文密钥,他也无法生成一个能够为不同的受助者正确解码的密钥。换句话说,如果向某人签署一个密钥是授权,那么实际上并不是由受让人做出这样的授权 - 该程序知道谁有权编写这些授权。
这很像一个Diffie Hellman交换,因为我们谈判共享秘密。不同之处在于,当我们加密到另一方时,即使我们以后也无法解密它。