JavaのRSA暗号:RSAモジュラスが小さな素因数を持っています

Dinura Seneviratne:

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();

暗号化メッセージのためのコード

        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)
kelalaka:

これは、セキュリティの大災害に対する警告です。

RSAでは、我々は、複合弾性率があることを期待n近くには2個の素因数を持つsqrt{n}1つの素数1は、簡単にあなたの弾性係数を考慮することができ、その後小さいとそうでない場合は、n=p qあなたの秘密指数ドライブd、BOOMを。

再び、キー-GENを実行します。また、公開指数を使用することを好みます3, 5, 17, 257 or 65537これは、より高速な計算を持っているのに役立ちます。あなたは17489を使用しかし、4乗算を必要と65537二乗を数えていない- 2を必要とします。

また、あなたが呼び出す必要があります

Cipher.getInstance("RSA/ECB/PKCS1Padding");

若しくは

Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");

ではありません

Cipher.getInstance("RSA");

これは、安全でない可鍛性であり、多くの攻撃を持っています。

RSAは、落とし戸関数です。暗号化と署名には、それが適切なパディングなしで使用すべきではありません。

  • 暗号化のために、PKCS1PaddingOAEPを使用することができます。OAEPは、より良い選択です。
  • 署名用のRSA-PSS

ご注意 RSA署名ではないRSA復号化です

また、次の点に注意してください実際には、それは一般的には、暗号化にRSAを使用することは好ましくない、RSAは署名に使用されます。私たちは、対称および非対称暗号化方式を組み合わせたハイブリッド暗号方式例えば、一つは使用することができるのDiffie-Hellman鍵交換をして共通鍵を確立するために、前進の秘密保持データがはるかに高速任意の非対称暗号システムよりもAESのような対称暗号化アルゴリズムで暗号化することができます。そこでは、また、ある鍵カプセル化メカニズム(KEM)とキーを確立するために使用することができRSA-KEMとして知られているRSA、にそれが適用されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=331914&siteId=1