尝试使用 RSA 加密消息:我不断收到此错误,但我不确定这意味着什么:
生成 key 的代码
generator = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec kpgSpec = new RSAKeyGenParameterSpec(2048, BigInteger.valueOf(17489));
generator.initialize(kpgSpec);
KeyPair keyPair = generator.generateKeyPair();
publicKey = (RSAPublicKey) keyPair.getPublic();
privateKey = (RSAPrivateKey) keyPair.getPrivate();
加密消息的代码
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(publicKeyBytes), BigInteger.valueOf(17489));
Cipher cipher;
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey currentKey = (RSAPublicKey) keyFactory.generatePublic(pubKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, currentKey);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
encrypted = bytesToString(encryptedBytes);
错误:
W/System.err: java.lang.IllegalArgumentException: RSA modulus has a small prime factor
W/System.err: at com.android.org.bouncycastle.crypto.params.RSAKeyParameters.validate(RSAKeyParameters.java:46)
at com.android.org.bouncycastle.crypto.params.RSAKeyParameters.<init>(RSAKeyParameters.java:28)
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.RSAUtil.generatePublicKeyParameter(RSAUtil.java:44)
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:288)
at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineInit(CipherSpi.java:406)
最佳答案
这是对安全灾难的警告。
在 RSA 中,我们期望复合模 n
有两个接近 sqrt{n}
* 的质因数,否则,如果一个质数很小,那么可以很容易地将您的模数分解为 n=p q
并驱动您的 secret 指数 d
,BOOM。
再次运行 key 生成器。此外,更喜欢使用公共(public)指数 3、5、17、257 或 65537
。这有助于加快计算速度。你used 17489这需要 4 次乘法,但是 65537
需要 2 次 - 不计算平方。
另外,你应该打电话
Cipher.getInstance("RSA/ECB/PKCS1Padding");
或
Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
不是
Cipher.getInstance("RSA");
这是不安全的、可塑的,并且有很多攻击。
RSA 是一个陷门函数。在加密和签名中,不应该在没有适当填充的情况下使用它。
- 用于加密,PKCS1Padding和 OAEP可以使用。 OAEP 是更好的选择。
- 供签名使用RSA-PSS
注意 RSA Signing is Not RSA Decryption .
还需要注意的是:其实并不推荐使用RSA来加密,一般情况下都是使用RSA来进行签名。我们在 Hybrid-Cryptosystem 中结合了对称和非对称加密方案.例如,可以使用 Diffie-Hellman Key exchange与 forward secrecy 建立公共(public) key 这样就可以使用 AES 等对称加密算法对数据进行加密,该算法比任何非对称密码系统都快得多。还有,Key Encapsulation Mechanism (KEM),适用于RSA,称为RSA-KEM,可用于建立 key 。
*请记住,如果素数彼此太接近,则适用费马因式分解
关于Java RSA 密码学 : RSA modulus has a small prime factor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084195/