生成的RSA公钥和私钥模数在Java / Android中是相同的

时间:2017-10-18 20:19:54

标签: java android encryption rsa

我是密码学的新手,我可能会问一个愚蠢的问题,但我一直无法找到答案。我在POC Android项目中用Java生成RSA密钥。我的目的是使用公钥加密用户密码并使用服务器中的私钥对其进行解密,同时应用此密码将允许我以更安全的方式(加密)将密码保存在设备中,然后自动使用它使用指纹身份验证。我使用常规Java方法生成密钥:

breakpoint='B'

然后我只需将这两个键记录到Android Studio Logcat:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();
PublicKey publicKey = key.getPublic();
PrivateKey privateKey = key.getPrivate();

...这就是我记录的内容:

Log.e(TAG, "Public key: " + publicKey);
Log.e(TAG, "Private key: " + privateKey);

问题:为什么生成的密钥中的两个模数都相等?我认为这不够安全,因为只要拥有公钥模数,有人可以很容易地拿出私钥,对吗?

1 个答案:

答案 0 :(得分:2)

您生成的是Java的关键。密钥对的公钥和私钥始终共享相同的模数:计算在该域内执行。

保持安全的不是模数,而是私有指数,并且 - 通常也可用 - 使用中国剩余定理(CRT)执行快速求幂所需的参数。这些基本上是诸如素数P和Q之类的参数,用于计算私钥和模数。

实际上,您可以使用模数来确定键是唯一的,因为每个键对应具有唯一的模数。这样,您还可以检查公钥和私钥是否属于同一对 - 无需进行签名生成/验证。

私人指数和CRT参数当然不会打印出来;模数足以识别私钥,您不希望通过打印私钥来破坏私钥的安全性。

如果你想要查看它们,那么你的私钥投射到RSAPrivateCrtKey并使用该类的getter。

请注意,只有基于软件的密钥可能会有getter返回信息,因此请注意尝试获取可能必须处理运行时异常的私有参数。