Ne AES/SRC faut vraiment IV paramètre?
Je suis en train d'écrire une application simple pour chiffrer mon message en utilisant AES /SRC (mode). Comme je crois comprendre le mode CBC nécessite IV paramètre mais je ne sais pas pourquoi mon code fonctionne sans IV paramètre utilisé. N'importe qui peut expliquer pourquoi? Merci.
Le message chiffré imprimé: T9KdWxVZ5xStaisXn6llfg== sans exception.
public class TestAES {
public static void main(String[] args) {
try {
byte[] salt = new byte[8];
new SecureRandom().nextBytes(salt);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keySpec = new PBEKeySpec("myPassword".toCharArray(), salt, 100, 128);
SecretKey tmp = keyFactory.generateSecret(keySpec);
SecretKeySpec key = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher enCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
enCipher.init(Cipher.ENCRYPT_MODE, key);
//enCipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
byte[] cipherBytes = enCipher.doFinal("myMessage".getBytes());
String cipherMsg = BaseEncoding.base64().encode(cipherBytes);
System.out.println("Encrypted message: " + cipherMsg);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Cela fonctionne parce que le Java sélectionne aléatoirement IV. vous pouvez utiliser
doridori.github.io/Android-Sécurité-Méfiez-vous-de-la-défaut-IV Comme vous avez été en utilisant
enCipher.getIV()
après init pour voir les valeurs (et les envoya de l'autre côté).doridori.github.io/Android-Sécurité-Méfiez-vous-de-la-défaut-IV Comme vous avez été en utilisant
AES/CBC/PKCS5Padding
il était probablement à l'aide de l'ancien AndroidOpenSSL
mise en œuvre, qui (malheureusement) la valeur par défaut d'un [0]
IVOriginalL'auteur | 2014-01-02
Vous devez vous connecter pour publier un commentaire.
Lorsqu'il est utilisé sans un IV, pour certains types d'algorithmes de chiffrement, y compris AES, il utilise implicitement 0 IV. Voir Cipher classe la documentation.
L'inconvénient d'une valeur null IV (ou déterministe, IV), c'est qu'il est vulnérable aux attaques par dictionnaire. L'exigence pour le IV est d'éviter que les mêmes plaine bloc de texte à produire le même texte chiffré à chaque fois.
En fait Java SE utilise un hasard IV si vous n'en indiquez pas. Votre lien pointe vers Java card API. Si vous ne spécifiez pas un, vous obtenez un randome un, vous avez besoin de récupérer,
cipher.getIV()
si vous n'avez pas défini.Voir stackoverflow.com/a/38127818/632951 pour une meilleure réponse.
Dépend de la
Provider
à utiliser aussi doridori.github.io/Android-Sécurité-Méfiez-vous-de-la-défaut-IVOriginalL'auteur bgamlath
Comme d'autres utilisateurs l'ont dit, cela dépend de la JCE fournisseur. Java SE génère un hasard IV pour vous si vous n'en indiquez pas.
Seulement Android1 et API Javacard utiliser un vide IV, qui est non conforme à la Java Crypto spec, laquelle les états:
Si vous ne spécifiez pas le IV, Java SE, vous obtenez un son aléatoire, et vous aurez besoin pour la récupérer,
cipher.getIV()
et de les stocker, car il sera nécessaire pour le décryptage.Mais mieux encore, la génération aléatoire IV-même, et de les fournir via
IvParameterSpec
.1 ce pourrait être parce Que Android est Java-esque, comme le Eminem-esque ad. Juste deviner, c'est tout.
OriginalL'auteur rustyx