Comment utiliser Château Gonflable API légère avec AES et PBE
J'ai un bloc de texte chiffré qui a été créé à l'aide de la JCE algorithim "PBEWithSHA256And256BitAES-CBC-BC". Le fournisseur est BouncyCastle. Ce que j'aimerais faire déchiffrer ce texte chiffré à l'aide de la BouncyCastle API légère. Je ne veux pas utiliser JCE car cela nécessite l'installation de la Force Illimitée de la Compétence de la Politique de Fichiers.
Documentation semble être mince sur le sol quand il vient à l'aide de la colombie-britannique (PBE et AES.
Voici ce que j'ai jusqu'à présent. Le déchiffrement du code s'exécute sans exception, mais les retours des ordures.
Le code de cryptage,
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());
}
Le déchiffrement du 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;
}
OriginalL'auteur Adrian | 2010-06-02
Vous devez vous connecter pour publier un commentaire.
J'ai essayé et ça semblait fonctionner. Largement inspirée de la colombie-britannique de la classe
org.bouncycastle.jce.provider.test.PBETest
la ligne pGen.generateDerivedParameters(256, 128); c'est que le réglage de la longueur de la clé ?
256 est la longueur de la clé; 128 est le IV de longueur.
OriginalL'auteur James K Polk
Il y avait quelques problèmes avec votre décrypter méthode:
Les principaux problèmes étaient la façon dont vous avez été l'exercice de décryptage sans l'aide d'un algorithme de chiffrement par bloc et le manque IV de la taille de la
generateDerivedParameters
méthode. J'ai vu le premier problème assez rapidement, le 2ème est beaucoup moins évidente. Je ne l'ai découvert que l'un par le biais de la recherche à un Château Gonflable test appelé PBETest.Merci pour les commentaires. J'ai un peu raté la GregS fourni une réponse quand il a fait. Je suis intéressé à trouver la raison de la taille pour que vecteur d'initialisation doit être de 128 et de la façon dont quelqu'un est censé savoir ce qui est nécessaire. C'était la partie qui m'a raccroché.
Les grands esprits se rencontrent 🙂 je savais que l'AES est un cryptage de 128-bit de chiffrement par bloc, de sorte que le IV de l'AES sera toujours de 128 bits. J'aurais pu utiliser BlockCipher.getBlockSize() * 8 pour être plus générique.
OriginalL'auteur laz
Il n'est pas trivial pour générer la clé exactement comme la JCE homologues. J'ai brièvement parcouru votre code. Trouvé au moins une différence. JCE utilise PKCS12 générateur, mais vous utilisez PKCS5S1.
Je ne suis pas surpris si il existe d'autres différences. Vous devez comparer votre code contre la colombie-britannique source.
OriginalL'auteur ZZ Coder
J'ai remarqué que la méthode de chiffrement accepte un mot de passe comme un tableau de char, mais la décrypter accepte le mot de passe que des octets. En Java, les caractères sont de 16 bits alors que les octets de 8 bits. Cela pourrait entraîner des clés différentes pour crypter/décrypter et peut-être expliquer les problèmes avec le charabia décrypté résultats?
OriginalL'auteur paradoxpenguin