За допомогою пароля на основі Bouncy Castle за допомогою шифрування AES в режимі CBC

Нещодавно я натрапив на шматок коду, який використовує PBE BouncyCastle з AES в режимі CBC ( «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());
    }
}

Як ви можете бачити, цей код не вказує правильний IV для виконання шифрування AES CBC.

Я не знаю, як вказати сірку, кількість ітерацій та IV, які будуть використані для шифру.

Як мені це зробити?

Дякую.

2
Що ви маєте на увазі, ви не вмієте вказувати соль та кількість ітерацій? Ви вже не зробили цього?
додано Автор Maarten Bodewes, джерело
Моєї відповіді не вистачало? Або ви не розумієте? Я радий, що ви хочете спостерігати за вашими питаннями, хоча 13 днів - трохи часу ...
додано Автор Maarten Bodewes, джерело
Я знаю, як вказати сіль і кількість ітерацій, які використовуються для створення сильного виведеного ключа шифрування з пароля, зазначеного користувачем. Після того, як цей ключ шифрування отримано, він використовується для шифрування даних за допомогою AES в режимі CBC. Оскільки режим 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
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників