Ich habe einen Block von Chiffretext, der mit dem JCE-Algorithmus "PBEWithSHA256And256BitAES-CBC-BC" erstellt wurde. Der Anbieter ist BouncyCastle. Was ich tun möchte, entschlüsseln Sie diesen Chiffretext mit der BouncyCastle Lightweight API. Ich möchte JCE nicht verwenden, da dies die Installation der Unzustellbarkeitsrichtlinie-Richtliniendateien erfordert.So verwenden Sie Bouncy Castle Lightweight-API mit AES und PBE
Dokumentation scheint dünn zu sein, wenn es darum geht, BC mit PBE und AES zu verwenden.
Hier ist, was ich bisher habe. Der Entschlüsselungscode läuft ohne Ausnahme, gibt aber Müll zurück.
Der Code-Verschlüsselung,
String password = "qwerty";
String plainText = "hello world";
byte[] salt = generateSalt();
byte[] cipherText = encrypt(plainText, password.toCharArray(), salt);
private static byte[] generateSalt() throws NoSuchAlgorithmException {
byte salt[] = new byte[8];
SecureRandom saltGen = SecureRandom.getInstance("SHA1PRNG");
saltGen.nextBytes(salt);
return salt;
}
private static byte[] encrypt(String plainText, char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
Security.addProvider(new BouncyCastleProvider());
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 20);
PBEKeySpec pbeKeySpec = new PBEKeySpec(password);
SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
Cipher encryptionCipher = Cipher.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
encryptionCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
return encryptionCipher.doFinal(plainText.getBytes());
}
Der Code Entschlüsselung
byte[] decryptedText = decrypt(cipherText, password.getBytes(), salt);
private static byte[] decrypt(byte[] cipherText, byte[] password, byte[] salt) throws DataLengthException, IllegalStateException, InvalidCipherTextException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
BlockCipher engine = new AESEngine();
CBCBlockCipher cipher = new CBCBlockCipher(engine);
PKCS5S1ParametersGenerator keyGenerator = new PKCS5S1ParametersGenerator(new SHA256Digest());
keyGenerator.init(password, salt, 20);
CipherParameters keyParams = keyGenerator.generateDerivedParameters(256);
cipher.init(false, keyParams);
byte[] decryptedBytes = new byte[cipherText.length];
int numBytesCopied = cipher.processBlock(cipherText, 0, decryptedBytes, 0);
return decryptedBytes;
}
Danke Greg. Funktioniert super. – Adrian
die Zeile pGen.generateDerivedParameters (256, 128); setzt das die Schlüssellänge? –
@george_h: 256 ist die Schlüssellänge; 128 ist die IV-Länge. –