Bouncy Castle'ın CBC modunda AES ile Şifre Tabanlı Şifreleme

Kısa bir süre önce, BouncyCastle'ın PBE'sini CBC modunda ("PBEWithSHA1And256BitAES-CBC-BC") kullanan bir kod parçasıyla karşılaştım.

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

Gördüğünüz gibi, bu kod AES CBC şifrelemesini yürütmek için uygun bir IV belirtmiyor.

Şifreye tuzu, ve kullanılacak olan iterasyon sayısını belirtmeyi bilmiyorum.

Bunu nasıl yapmalıyım?

Teşekkür ederim.

2
Ne demek istiyorsun, tuz ve iterasyon sayısını nasıl belirleyeceğini bilmiyorsun? Bunu zaten yapmadın mı?
katma yazar Maarten Bodewes, kaynak
Cevabım yeterli olmadı mı? Yoksa anlamıyor musun? En azından 13 gün biraz zaman geçmesine rağmen sorularınızı takip etmene sevindim ...
katma yazar Maarten Bodewes, kaynak
Kullanıcı tarafından belirtilen paroladan güçlü bir türetilmiş şifreleme anahtarı oluşturmak için kullanılan tuz ve yineleme sayısını belirtmeyi biliyorum. Şifreleme anahtarı türetildikten sonra, CBC modunda AES kullanarak verileri şifrelemek için kullanılır. Mod CBC olduğu için, nasıl olduğunu anlayamadığım bir IV belirtmek isteriz!
katma yazar jsanchez, kaynak

3 cevap

Jasypt (java basit şifreleme) PBEWithSHA1And256BitAES-CBC-BC'yi kullanabilirsiniz.

örnek kod aşağıdaki gibi gösterilmiştir:

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
katma

Eğer bir IV kullanmak istiyorsanız, o zaman rastgele bir anahtar oluşturmanız ve şimdi düz metni şifrelediğiniz yerde şifrelemeniz gerektiğini düşünüyorum. Bunu, IV'ü belirtmek için IvParameterSpec kullanarak verileri şifrelemek için kullanabilirsiniz. Elbette şifrelenmiş anahtarı ve şifrelenmiş olduğunuz verilerin yanında IV'ü kaydetmeniz gerekir. Bu, yalnızca aynı anahtarla birden fazla düz metin kopyalamanız durumunda gereklidir.

1
katma

Jasypt ve BouncyCastle 1.51'i (SpongyCastle) kullanarak aşağıdakileri kullanabilirdim

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

Ve bu şekilde oldukça kolaydı

    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 'ı da ayarlayabilirsiniz.

0
katma