Comment fixer le NoSuchAlgorithmException en Java lors de l'utilisation de Blowfish?
Donc je suis en train d'écrire un programme pour crypter et décrypter des fichiers texte, mais j'ai l'impression de toujours obtenir ce message d'erreur lorsque j'utilise un encrypthion autre que "Blowfish" (par exemple "Blowfish/SRC/PKCS5Padding"). Le excepthiong que je reçois est:
Exception in thread "main" java.security.NoSuchAlgorithmException: Blowfish/CBC/PKCS5Padding KeyGenerator not available
at javax.crypto.KeyGenerator.<init>(DashoA13*..)
at javax.crypto.KeyGenerator.getInstance(DashoA13*..)
at Encryptor.<init>(Encryptor.java:87)
at Encryptor.main(Encryptor.java:30)
Une partie de mon code:
import java.security.MessageDigest;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Encryptor2 {
private IvParameterSpec ivSpec;
private SecretKeySpec keySpec;
private Cipher cipher;
public static void main(String[] args) throws Exception {
Encryptor2 e = new Encryptor2(
"averylongtext!@$@#$#@$#*&(*&}{23432432432dsfsdf");
String enc = e.encrypt("john doe");
String dec = e.decrypt(enc);
}
public Encryptor2(String pass) throws Exception {
//setup AES cipher in CBC mode with PKCS #5 padding
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//setup an IV (initialization vector) that should be
//randomly generated for each input that's encrypted
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
ivSpec = new IvParameterSpec(iv);
//hash keyString with SHA-256 and crop the output to 128-bit for key
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(pass.getBytes());
byte[] key = new byte[16];
System.arraycopy(digest.digest(), 0, key, 0, key.length);
keySpec = new SecretKeySpec(key, "AES");
}
public String encrypt(String original) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(original.getBytes("UTF-8"));
System.out.println("encrypted: `" + new String(encrypted) + "`");
return new String(encrypted);
}
public String decrypt(String encrypted) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decrypted = cipher.doFinal(encrypted.getBytes("UTF-8"));
System.out.println("decrypted: `" + new String(decrypted, "UTF-8")
+ "`");
return new String(decrypted, "UTF-8");
}
}
Mais maintenant il ne fonctionne pas avec Input length must be multiple of 16 when decrypting with padded cipher
OriginalL'auteur Tamer | 2011-04-23
Vous devez vous connecter pour publier un commentaire.
Les autres paramètres que vous spécifiez avec l'algorithme sont destinés à
Cipher
. PourKeyGenerator
etSecretKeySpec
vous ne spécifiez l'algorithme. Les autres paramètres pour le mode de chiffrement de fonctionnement et de rembourrage pour être utilisé. Par exemple, si vous utilisez Blowfish en mode CBC avec PKCS #5 rembourrage que vous voulez:Voir Le cryptage et le Décryptage à l'Aide de Java: Impossible d'obtenir le même résultat pour un exemple. Il utilise le même mode et le rembourrage que vous avez. La seule différence est qu'utilise AES au lieu de Blowfish, cependant, il fonctionne exactement de la même.
claire" est une chose, mais que vous avez posté tout à fait clair code qui n'est pas la même chose que ce WhiteFang34 a posté. Avez-vous envoyer votre code réel ou pas?
Vous avez besoin de spécifier seulement
"Blowfish"
. Vous n'aurez qu'à passer"Blowfish/CBC/PKCS5Padding"
àCipher.getInstance()
.Ahh. Ok, je m'excuse, j'ai complètement mal compris votre réponse et je comprends ce que j'ai à faire maintenant. Je l'ai essayé et cela fonctionne, mais maintenant j'ai une autre exception:
Parameters missing
mais c'est une autre question, je vais regarder dans. Merci beaucoup!J'ai ajouté un lien vers un exemple avec des détails qui utilise de la SRC. Vous devez spécifier un IV (vecteur d'initialisation) pour ce mode.
OriginalL'auteur WhiteFang34