【发布时间】:2019-01-28 17:21:35
【问题描述】:
我在 iOS 解决方案上使用 RSA 解密。我想使用 Java 端使用的相同参数来创建 privateKey,但我无法找到方法。 有没有办法做到这一点,或者是否可以使用 Java 导出这个 privateKey,然后在 iOS 解决方案上导入它?
byte[] modulusBytes = Base64.decode("base64EncodedString");
byte[] DBytes = Base64.decode("anotherBase64EncodedString");
BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, DBytes);
RSAPrivateKeySpec rsaPrivKey = new RSAPrivateKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey privKey = fact.generatePrivate(rsaPrivKey);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
我的 iOS 应用程序将使用此算法解密 QRCode。 QRCode 使用 Java 通过如下所示的公钥加密。为了解密这段代码,我们在 Java 端使用上面的代码。那么我们如何生成能够解密的相同私钥呢?没有相同的模数和指数可以做到吗?
byte[] modulusBytes = Base64.decode("base64EncodedString");
byte[] exponentBytes = Base64.decode("AQAB");
BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, exponentBytes);
RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);
【问题讨论】:
-
那你真的没有私钥吧?实际上,您的私钥实际上是用于派生您的实际私钥的参数
-
不,我没有私钥,我想使用模数和指数创建它
-
有两种情况。如果转换模数和指数的函数是确定性的(即每次都为相同的参数产生相同的答案),那么实际上,您的模数和指数将成为您的私钥(因为使用它们是微不足道的)他们像你一样,创建实际的 RSA 私钥)。它们就在您的源代码中,供所有人使用。那是不安全的。
-
这就像在您的前门锁旁边留下一张房子钥匙、一些钥匙坯和一些工具的照片。你的钥匙不是唯一的钥匙,[照片、空白、工具]的组合现在是一把新钥匙,任何人都可以用它来打开你的锁
-
那么正如我所说,这意味着这种加密方案完全不安全,几乎没有用处。你的模块和指数实际上变成了私钥,它们就在那里,任何人都可以从你的应用程序代码中读取。
标签: java ios swift rsa private-key