Décryptage en Java avec Blowfish
Tiens,
Je suis le cryptage et le décryptage en Java avec Blowfish.
Le cryptage fonctionne bien, mais le déchiffrement échoue.
Voici mon code Java pour le décryptage :
String encryptedString = … ;
String decryptedString = null;
SecretKeySpec key = new SecretKeySpec(myKey.getBytes(), "Blowfish");
Cipher cipher;
try {
cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encryptedString.getBytes());
decryptedString = new String(decrypted, Charset.forName("UTF-8"));
} [ catch Exceptions … ]
J'obtiens une exception :
Exception. javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
Pouvez-vous me dire comment faire cela simplement, travail ? Merci.
L'entrée je vient de mon chiffrement du code Java, + encodage en Base64, et je le décoder à partir de Base64 juste avant de la donner à ce décryptage de l'opération.
- Les données codées venir en blocs de 8 bits. Si vous avez dire 22 bits, vous devez utiliser le rembourrage pour les 2 lors du chiffrement. C'est l'idée avec des algorithmes de chiffrement par bloc. Voir en.wikipedia.org/wiki/Blowfish_%28cipher%29
- Qui ne m'aide pas beaucoup. J'ai édité mon post pour être plus précis.
Vous devez vous connecter pour publier un commentaire.
La conversion d'octets en hexadécimal et à l'arrière est difficile. Cela devrait résoudre votre problème. (Vous avez besoin pour réparer votre représentation de chaîne de encryptedString)
De sortie:
Code:
Maclé variable longueur doit être un multiple de 8
Vous pouvez utiliser Base64 classe pour résoudre ce problème.
Maintenant, j'ai la solution !
Tout d'abord, il y avait quelques problèmes avec Unicode, donc j'ai mis l'ISO-8859-1 partout. Y compris dans le Base64 d'encodage et de décodage.
Ensuite, j'ai jonglé avec les variantes.
Voici mon code Java qui fonctionne pour Blowfish déchiffrement :
Noter que j'ai remplacé
"Blowfish"
avec"Blowfish/ECB/PKCS5Padding"
pour obtenir leCipher
instance, mais, si vous faites de même pour la clé, il échoue.La clé
myKey
doit être un Latin-1 chaîne de 8 caractères. Cela fait une clé de 128 bits. L'algorithme Blowfish permet un clavier plus grand, mais ils ne parviennent pas à Java en raison de l'exportation des états-unis restriction dans le JRE — les etats-unis permettent de cryptage, mais pas plus fort que ce que l' La NSA peuvent se briser.La
CHARSET_ISO_8859_1
est une constante définie comme ceci :Et
Charset
estjava.nio.charset.Charset
.Dernier mais non le moins, j'ai changé de chiffrement du code Java en conséquence.
byte[] decrypted = cipher.doFinal(encryptedString.getBytes(CHARSET_ISO_8859_1));
je vois une mauvaise pratique. Le fait que la ligne n'existe pas réellement dans votre programme n'est pas pertinent.myKey
de seulement 8 caractères.Vous devez certainement être plus explicite avec la
Cipher
en déclarant la mode et de rembourrage. Comment est-ce code se sont chiffrés? Ce qui est réellement dans leString
encryptedString
? Est-il codé en hexadécimal ou base64? Si elle n'est pas codée qui pourrait certainement être une source de problèmes.Essayer cette
ici vous pouvez trouver toute la classe avec des enc/dec --- http://dexxtr.com/post/57145943236/blowfish-encrypt-and-decrypt-in-java-android
ALGORITM
n'existerait pas. Et j'ai un gros doute surCipher.ENCRYPT_MODE
, pour le décryptage.