Criptarea bazată pe parolă de către Bouncy Castle cu AES în modul CBC

Recent am dat peste o bucată de cod care folosește BouncyCastle's PBE cu AES în modul 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());
    }
}

După cum puteți vedea, acest cod nu specifică un IV adecvat pentru a executa criptarea AES CBC.

Nu știu cum să precizez sarea, numărul de iterații și IV care urmează să fie utilizate la cifru.

Cum ar trebui să fac asta?

Mulțumesc.

2
Ce vrei să spui, nu știi cum să specifici sarea și numărul de iterații? N-ai făcut deja asta?
adăugat autor Maarten Bodewes, sursa
Răspunsul meu nu este suficient? Sau nu înțelegi? Mă bucur că cel puțin urmăriți întrebările dvs., deși 13 zile sunt puțin timp ...
adăugat autor Maarten Bodewes, sursa
Știu cum să precizez sarea și numărul de iterații, care sunt folosite pentru a genera o cheie puternică de criptare derivată din parola specificată de utilizator. Odată ce această cheie de criptare este derivată, aceasta este utilizată pentru a cripta datele utilizând AES în modul CBC. Deoarece modul este CBC, am dori să specificăm un IV care nu-mi dau seama cum!
adăugat autor jsanchez, sursa

3 răspunsuri

Puteți folosi jasypt (criptare simplă Java) PBEWithSHA1And256BitAES-CBC-BC

codul eșantionului este afișat după cum urmează:

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
adăugat

Cred că dacă doriți să utilizați un IV, va trebui să generați o cheie aleatoare și să o criptați în locul în care acum criptați textul simplu. Apoi, puteți utiliza această funcție pentru a cripta datele, utilizând IvParameterSpec pentru a specifica IV. Desigur, trebuie să stocați cheia criptată și IV lângă datele pe care le-ați criptat. Acest lucru este necesar numai dacă criptați mai mult de un plaintext cu aceeași cheie.

1
adăugat

Folosind Jasypt și BouncyCastle 1.51 (SpongyCastle), aș fi putut folosi următoarele

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

Și astfel a fost destul de ușor

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

Puteți seta și SaltGenerator .

0
adăugat