Bouncy Castle's wachtwoordgebaseerde codering met AES in CBC-modus

Ik ben onlangs een stuk code tegengekomen dat BouncyCastle's PBE gebruikt met AES in CBC-modus ("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());
    }
}

Zoals u kunt zien, specificeert deze code geen juiste IV om de AES CBC-codering uit te voeren.

Ik weet niet hoe ik het zout, het aantal iteraties en de te gebruiken IV moet opgeven voor het cijfer.

Hoe moet ik dat doen?

Dank je.

2
Wat bedoel je, je weet niet hoe je het zout en aantal iteraties moet specificeren? Heb je dat al niet gedaan?
toegevoegd de auteur Maarten Bodewes, de bron
Mijn antwoord was niet voldoende? Of begrijp je het niet? Ik ben blij dat je op zijn minst je vragen opvolgt, hoewel 13 dagen een beetje tijd is ...
toegevoegd de auteur Maarten Bodewes, de bron
Ik weet hoe ik het zout en het aantal iteraties moet specificeren, die worden gebruikt om een ​​sterk afgeleide coderingssleutel te genereren op basis van het wachtwoord dat door de gebruiker is opgegeven. Zodra die coderingssleutel is afgeleid, wordt deze gebruikt om gegevens te coderen met AES in de CBC-modus. Omdat de modus CBC is, willen we een IV specificeren die ik niet kan achterhalen!
toegevoegd de auteur jsanchez, de bron

3 antwoord

U kunt jasypt (java simple encryption) gebruiken PBEWithSHA1And256BitAES-CBC-BC

de voorbeeldcode wordt getoond zoals hieronder:

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
toegevoegd

Ik denk dat als u een IV wilt gebruiken, u een willekeurige sleutel moet genereren en deze coderen op de plek waar u nu de onbewerkte tekst codeert. U kunt dat vervolgens gebruiken om de gegevens te coderen, met behulp van IvParameterSpec om de IV op te geven. Natuurlijk moet u de gecodeerde sleutel en de IV opslaan naast de gegevens die u hebt gecodeerd. Dit is alleen nodig als u meer dan één leesbare tekst met dezelfde sleutel codeert.

1
toegevoegd

Met Jasypt en BouncyCastle 1.51 (SpongyCastle) had ik het volgende kunnen gebruiken

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

En op deze manier was het vrij eenvoudig

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

U kunt ook SaltGenerator instellen.

0
toegevoegd