2017-10-18 224 views
1

我是加密中的新手,可能我在问一个愚蠢的问题,但我一直无法找到答案。我在POC Android项目中使用Java生成RSA密钥。我的目的是用公钥加密用户密码并使用服务器中的私钥解密,同时这也将允许我以更安全的方式将密码保存在设备中(加密),然后自动使用它使用指纹验证。我生成与常规的Java方法的关键:生成的RSA公钥和私钥模数在Java/Android中是相同的

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

然后我只需登录两个键到Android工作室logcat的是这样的:

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

...这是我得到什么记录:

10-18 15:27:17.570 22426-22426/cliu.tutorialcrypto E/AsymmetricAlgorithmRSA: Public key: OpenSSLRSAPublicKey{modulus=c1312eb5c24da9577dd40263cec233b8be40ed227b81df3c442363f1dfd5364e9e2ba96d4dd7c1011d2633d6603beb1a483b75b8af8a87b10ebe918729b6afe95893d5c93b3f99727785110f2373d20ced8bfe2421c9c682ee737c60a7c6199be3d2e7e4687d69cedc50965b8cebc4445cdfe7a13a7df5eda6a6d4304d057505,publicExponent=10001} 
10-18 15:27:17.570 22426-22426/cliu.tutorialcrypto E/AsymmetricAlgorithmRSA: Private key: OpenSSLRSAPrivateCrtKey{modulus=c1312eb5c24da9577dd40263cec233b8be40ed227b81df3c442363f1dfd5364e9e2ba96d4dd7c1011d2633d6603beb1a483b75b8af8a87b10ebe918729b6afe95893d5c93b3f99727785110f2373d20ced8bfe2421c9c682ee737c60a7c6199be3d2e7e4687d69cedc50965b8cebc4445cdfe7a13a7df5eda6a6d4304d057505,publicExponent=10001} 

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

回答

2

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

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

实际上,您可以使用模数来确定密钥是唯一的,因为每个密钥对都应具有唯一的模数。通过这种方式,您还可以检查公钥和私钥是否属于同一对 - 而不进行签名生成/验证。


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

如果你想看到他们,无论如何,然后你私人密钥来RSAPrivateCrtKey和使用类的干将。

请注意,只有基于软件的密钥才有可能让获取者返回信息,因此请注意尝试访问您可能需要处理运行时异常的私有参数。