最近、BouncyCastleのPBE with AES in CBC mode ("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をどのように指定すればよいのかわからない。
**どのようにすればよいのでしょうか?
ありがとうございます。
jasypt (java simple encryption) 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));
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`も設定できます。