Wie zu verwenden Bouncy Castle lightweight API mit AES und PBE
Habe ich einen block ciphertext erstellt wurde mit dem JCE-Algorithmus "PBEWithSHA256And256BitAES-CBC-BC". Der provider ist BouncyCastle. Was würde ich gerne tun, es entschlüsselt diese verschlüsselte Text mit dem BouncyCastle lightweight API. Ich will nicht von JCE, denn das erfordert die Installation der Unlimited Strength Jurisdiction Policy-Dateien.
Dokumentation scheint zu Dünn auf dem Boden, wenn es darum geht, mit BC mit PBE und AES.
Hier ist, was ich habe, so weit. Der Entschlüsselungs-code wird ausgeführt, ohne Ausnahme, kehrt aber Müll.
Den Verschlüsselungs-code,
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());
}
Den Entschlüsselungs-code,
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;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich versuchte dies und es schien zu funktionieren. Ausgeliehen stark von der BC-Klasse
org.bouncycastle.jce.provider.test.PBETest
Gab es ein paar Probleme mit Ihrem decrypt-Methode:
Die Probleme waren Weg Sie waren, die Durchführung der Entschlüsselung ohne Verwendung einer block-Chiffre und die fehlenden IV Größe der
generateDerivedParameters
Methode. Ich sah das erste problem ziemlich schnell, die 2. war viel weniger offensichtlich. Ich habe nur entdeckt, dass man durch das betrachten einer Hüpfburg test genannt PBETest.Ist es nicht trivial, den Schlüssel zu erzeugen, genau wie der JCE-Pendants. Ich habe nur kurz gestöbert Ihrem code. Gefunden mindestens eine Diskrepanz. JCE verwendet PKCS12-generator, aber Sie verwenden PKCS5S1.
Bin ich nicht überrascht, wenn es gibt andere Unterschiede. Sie müssen vergleichen Sie Ihren code gegen BC Quelle.
Ich bemerkt, dass die encryption-Methode akzeptiert ein Passwort als char-array, aber das entschlüsseln übernimmt das Kennwort als Byte. In Java-chars sind 16-bit, während die bytes sind 8-bit. Dies könnte dazu führen, dass verschiedene Schlüssel für das verschlüsseln/entschlüsseln und vielleicht erklären die Probleme mit Kauderwelsch entschlüsselt Ergebnisse?