J'ai un bloc de CIPHertext créé à l'aide de l'algorithme JCE "PBEWITHSHA256AND256BITAES-CBC-BC". Le fournisseur est Bouncycastle. Ce que j'aimerais faire, cela déchiffrer ce ciIphertext à l'aide de l'API Bouncycastle Lightweight. Je ne veux pas utiliser JCE parce que cela nécessite d'installer les fichiers de stratégie de juridiction de force illimités.
La documentation semble être mince sur le sol lorsqu'il s'agit d'utiliser BC avec PBE et AES. P>
Voici quoi J'ai jusqu'à présent. Le code de déchiffrement fonctionne sans exception, mais renvoie des ordures. P>
Le code de cryptage, P>
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; }
4 Réponses :
Ce n'est pas trivial de générer la clé exactement comme les contreparties JCE. Je viens de naviguer brièvement votre code. Trouvé au moins une divergence. JCE utilise le générateur PKCS12 mais vous utilisez PKCS5S1. p>
Je ne suis pas surpris s'il y a d'autres différences. Vous devez comparer votre code contre la source de la BC. P>
Merci pour ça zz. J'ai essayé d'utiliser PKCS12 aussi, mais cela n'a pas fait de différence.
J'ai essayé cela et cela semblait travailler. Emprunté lourdement à partir de la classe BC org.bouncycastle.jce.provider.test.pbetest code>
la ligne pgen.GenerateDearAreters (256, 128); Est-ce que cela réglage la longueur de la clé?
@george_h: 256 est la longueur de la clé; 128 est la longueur IV.
Il y avait quelques problèmes avec votre méthode de déchiffrement:
private static byte[] decrypt(final byte[] bytes, final char[] password, final byte[] salt) throws DataLengthException, IllegalStateException, InvalidCipherTextException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException { final PBEParametersGenerator keyGenerator = new PKCS12ParametersGenerator(new SHA256Digest()); keyGenerator.init(PKCS12ParametersGenerator.PKCS12PasswordToBytes(password), salt, 20); final CipherParameters keyParams = keyGenerator.generateDerivedParameters(256, 128); final BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), new PKCS7Padding()); cipher.init(false, keyParams); final byte[] processed = new byte[cipher.getOutputSize(bytes.length)]; int outputLength = cipher.processBytes(bytes, 0, bytes.length, processed, 0); outputLength += cipher.doFinal(processed, outputLength); final byte[] results = new byte[outputLength]; System.arraycopy(processed, 0, results, 0, outputLength); return results; }
Merci paz. Votre solution fonctionne parfaitement, mais depuis Greg répondit en premier, ce n'est que juste que j'accepte sa réponse.
Merci pour les commentaires. Je manquai d'en quelque sorte que Gregs a fourni une réponse quand il l'a fait. Je suis intéressé à découvrir pourquoi la taille de ce vecteur d'initialisation doit être 128 et comment une personne est censée savoir que c'est nécessaire. C'était la partie qui m'a raccroché.
Les grands esprits pensent ressembler à :) Je savais que AES est un chiffre à blocs de 128 bits, le IV pour AES sera donc toujours de 128 bits. J'aurais pu utiliser blockcipher.getBlockSize () * 8 pour être plus générique.
J'ai remarqué que votre méthode de cryptage accepte un mot de passe en tant que tableau de caractères, mais le Decrypt accepte le mot de passe comme des octets. En Java, les caractères sont de 16 bits tandis que les octets sont 8 bits. Cela pourrait donner lieu à des clés différentes pour chiffrer / déchiffrer et peut-être expliquer les problèmes avec des résultats déchiffs de gibberish? P>