Bouncy Castleのパスワードベースの暗号化CESモードでのAES

私は最近、CBCモードのAESでBouncyCastleのPBEを使用するコード(「PBEWithSHA1And256BitAES-CBC-BC」)を紹介しました。

public static final String ALGORITHM = "PBEWithSHA1And256BitAES-CBC-BC";

public static byte[] encrypt(final byte[] key, final byte[] salt, final byte[] plainText) throws CryptoException {
    try {
       //Create the encryption key
        final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM, "BC");
        final PBEKeySpec keySpec = new PBEKeySpec(new String(key).toCharArray());
        final SecretKey secretKey = keyFactory.generateSecret(keySpec);

       //Encrypt the plain text
        final PBEParameterSpec cipherSpec = new PBEParameterSpec(salt, ITERATIONS);
        final Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, cipherSpec);
        final byte[] encryptedBytes = cipher.doFinal(plainText);

        return encryptedBytes;

    } catch (final Throwable t) {
        throw new CryptoException(t.toString());
    }
}

ご覧のとおり、このコードはAES CBC暗号化を実行するための適切なIVを指定していません。

私は、暗号をどのように指定するのか、繰り返し回数とIVを使用するのかを暗号にはわかりません。

どうすればよいですか?

ありがとうございました。

2
どのように塩と繰り返し数を指定するのか分からないのはどういう意味ですか?あなたはすでにそれをしていませんか?
追加された 著者 Maarten Bodewes,
私の答えは十分ではありませんでしたか?それともあなたは理解できないのですか? 13日はちょっとしたことですが、少なくともあなたの質問にはフォローアップができてうれしいです...
追加された 著者 Maarten Bodewes,
私は、ユーザーが指定したパスワードから強力な派生暗号鍵を生成するために使用される、saltと反復回数を指定する方法を知っています。その暗号鍵が導出されると、CBCモードでAESを使用してデータを暗号化するために使用されます。モードはCBCなので、私はどのように把握できないIVを指定したいと思います!
追加された 著者 jsanchez,

3 答え

あなたはjasypt(Javaの単純な暗号化)を使用することができますPBEWithSHA1And256BitAES-CBC-BC

サンプルコードは次のようになります。

StandardPBEStringEncryptor myFirstEncryptor = new StandardPBEStringEncryptor();                                                                                                      
myFirstEncryptor.setProvider(new BouncyCastleProvider());                                                                                                    

myFirstEncryptor.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");                                                                                         




FixedStringSaltGenerator generator = new FixedStringSaltGenerator();                                                                                         
generator.setSalt("justAnotherSaltforGX");
//myFirstEncryptor.setSaltGenerator(new ZeroSaltGenerator());                                                                                                    

myFirstEncryptor.setSaltGenerator(generator);                                                                                                                    

myFirstEncryptor.setKeyObtentionIterations(1);                                                                                                               
String myPassword="creditCard";                                                                                                                              
myFirstEncryptor.setPassword(myPassword);                                                                                                                    


String myText="Redeem Gacha ";                                                                                                         
String myFirstEncryptedText = myFirstEncryptor.encrypt(myText);                                                                                              

System.out.println("myFirstEncryptedText AES encrypt=="+myFirstEncryptedText);                                                                               

System.out.println("myFirstEncryptedText AES decrypt =="+myFirstEncryptor.decrypt(myFirstEncryptedText));
3
追加された

IVを使用する場合は、ランダムな鍵を生成し、プレーンテキストを暗号化した場所で暗号化する必要があります。それを使ってデータを暗号化し、IvParameterSpecを使ってIVを指定することができます。もちろん、暗号化したデータの横に暗号化されたキーとIVを格納する必要があります。これは、同じ鍵で複数の平文を暗号化する場合にのみ必要です。

1
追加された

JasyptとBouncyCastle 1.51(SpongyCastle)を使用して、私は以下を使用することができました

Algorithm: PBEWITHSHAAND128BITAES-CBC-BC
Algorithm: PBEWITHSHAAND192BITAES-CBC-BC
Algorithm: PBEWITHSHAAND256BITAES-CBC-BC
Algorithm: PBEWITHSHA256AND128BITAES-CBC-BC
Algorithm: PBEWITHSHA256AND192BITAES-CBC-BC
Algorithm: PBEWITHSHA256AND256BITAES-CBC-BC
Algorithm: PBEWITHMD5AND128BITAES-CBC-OPENSSL
Algorithm: PBEWITHMD5AND192BITAES-CBC-OPENSSL
Algorithm: PBEWITHMD5AND256BITAES-CBC-OPENSSL
Algorithm: PBEWITHMD5AND128BITAES-CBC-OPENSSL
Algorithm: PBEWITHMD5AND192BITAES-CBC-OPENSSL
Algorithm: PBEWITHMD5AND256BITAES-CBC-OPENSSL
Algorithm: PBEWITHSHAAND128BITAES-CBC-BC
Algorithm: PBEWITHSHAAND192BITAES-CBC-BC
Algorithm: PBEWITHSHAAND256BITAES-CBC-BC
Algorithm: PBEWITHSHA256AND128BITAES-CBC-BC
Algorithm: PBEWITHSHA256AND192BITAES-CBC-BC
Algorithm: PBEWITHSHA256AND256BITAES-CBC-BC

そして、これはとても簡単でした

    StandardPBEByteEncryptor strongBinaryEncryptor = new StandardPBEByteEncryptor();
    strongBinaryEncryptor.setAlgorithm("PBEWITHSHAAND192BITAES-CBC-BC");
    strongBinaryEncryptor.setKeyObtentionIterations(1000);
    strongBinaryEncryptor.setProviderName(BouncyCastleProvider.PROVIDER_NAME);
    strongBinaryEncryptor.setPassword(password);

    byte[] encryptedBytes = strongBinaryEncryptor.encrypt(password);

SaltGenerator も設定できます。

0
追加された