Java RSA密码术:RSA模数的素数很小

Din*_*tne 1 java encryption cryptography rsa public-key-encryption

尝试使用RSA加密消息:我一直收到此错误,但是我不确定这意味着什么:

生成密钥的代码

    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();
Run Code Online (Sandbox Code Playgroud)

编码消息的代码

        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);
Run Code Online (Sandbox Code Playgroud)

错误:

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)
Run Code Online (Sandbox Code Playgroud)

kel*_*aka 5

这是对安全灾难的警告。

在RSA中,我们期望复合模数n有两个接近的素数因子sqrt{n},否则,如果一个素数较小,则一个可以轻松地将您的模数分解为因子n=p q并推动您的秘密指数dBOOM。

再次运行key-gen。另外,更喜欢使用public指数3, 5, 17, 257 or 65537。这有助于更快地进行计算。您使用了17489,它需要4个乘法,但是65537需要2个-不计算平方。

另外,你应该打电话

Cipher.getInstance("RSA/ECB/PKCS1Padding");
Run Code Online (Sandbox Code Playgroud)

要么

Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
Run Code Online (Sandbox Code Playgroud)

Cipher.getInstance("RSA");
Run Code Online (Sandbox Code Playgroud)

这是不安全的,具有延展性的,并且有很多攻击。

RSA是一个活板门功能。在加密和签名中,如果没有适当的填充,则永远不要使用它。

请注意, RSA签名不是RSA解密

还应注意:实际上,使用RSA进行加密不是首选,通常,RSA用于签名。我们在混合加密系统中结合了对称和非对称加密方案。例如,可以使用Diffie-Hellman密钥交换来建立具有前向保密性的公共密钥,以便可以使用对称加密算法(例如AES)对数据进行加密,该算法比任何非对称密码系统都要快得多。还存在密钥封装机制(KEM),它适用于RSA,称为RSA-KEM,可用于建立密钥。