Java RSA 密码学 : RSA modulus has a small prime factor

标签 java encryption cryptography rsa public-key-encryption

尝试使用 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 是一个陷门函数。在加密和签名中,不应该在没有适当填充的情况下使用它。

注意 RSA Signing is Not RSA Decryption .

还需要注意的是:其实并不推荐使用RSA来加密,一般情况下都是使用RSA来进行签名。我们在 Hybrid-Cryptosystem 中结合了对称和非对称加密方案.例如,可以使用 Diffie-Hellman Key exchangeforward 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/

相关文章:

java - 计算不完美的圆

java - 使用java通过3DES-128位CBC模式(填充零)解密数据

ios - 如何保护我的音乐应用程序下载的音乐文件?

java - 如何停止 Storm 中的元组处理并执行其他代码

java - 是否可以检索执行 AspectJ 方法调用的对象实例?

java - openjdk 1.6 jvm垃圾收集设置

java - AES 加密 badPadding

algorithm - 密码算法加密作业

security - 同态加密算法的实际应用?

php - 如何在php中加密/解密数据?