Pourquoi PBE génère même clé avec le sel et le nombre d'itérations?
Je suis en train de test PBE de chiffrement/déchiffrement. J'ai trouvé que PBE génère même clé avec le sel et le nombre d'itérations. Bien sûr, le mot de passe utilisé est le même.
Comme ce que je comprends, même mot de passe et sel/itération doit obtenir des clés différentes.
Ci-dessous mon code de test:
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
public class PBETest
{
public static void main(String[] args)
throws Exception
{
String algo = "PBEWithSHA1andDESede";
System.out.println("====== " + algo + " ======");
char[] password = "password".toCharArray();
SecureRandom rand = new SecureRandom();
byte[] salt = new byte[32];
rand.nextBytes(salt);
int iterationCount = rand.nextInt(2048);
//encryption key
PBEKeySpec encPBESpec = new PBEKeySpec(password, salt, iterationCount);
SecretKeyFactory encKeyFact = SecretKeyFactory.getInstance(algo);
Key encKey = encKeyFact.generateSecret(encPBESpec);
System.out.println("encryptioin iteration: " + iterationCount);
//decryption key
rand.nextBytes(salt);
iterationCount = rand.nextInt(2048);
PBEKeySpec decPBESpec = new PBEKeySpec(password, salt, iterationCount);
SecretKeyFactory decKeyFact = SecretKeyFactory.getInstance(algo);
Key decKey = decKeyFact.generateSecret(decPBESpec);
System.out.println("decryptioin iteration: " + iterationCount);
System.out.println("encryption key is same as decryption key? " + encKey.equals(decKey));
}
}
Je m'attends à ce que le résultat final est un false
.
Ai-je fais quelque chose de mal?
OriginalL'auteur Michael | 2012-07-26
Vous devez vous connecter pour publier un commentaire.
Vous avez obtenu de façon spectaculaire de la chance, et votre aléatoires sels d'itération et de compte juste arrivé de match. Aller directement à Las Vegas. Maintenant. 😉
J'ai googlé pour PBEWithSHA1andDESede et traqué cet exemple: http://cryptofreek.org/2010/06/04/encrypting-and-decrypting-files-with-java dans lequel il spécifie la clé seul avec
new PBEKeySpec(password)
et crée un autrePBEParameterSpec
en utilisant le sel et le nombre d'itérations qui est ensuite transmis à l'algorithme de Chiffrement.init().Donc, non, vous n'avez rien fait de mal, vous avez juste arrêté avant que le sel et le comte est arrivé en peluche dans l'algorithme de chiffrement.
#2 et #3 semblent expliquer la situation. J'ai essayé d'aller de l'avant pour chiffrer le texte et les données chiffrées sont à chaque fois différentes. Donc ma conclusion est: La clé générée par SecretKeyFactory.generateSecret() ne concerne que le mot de passe. C'est vrai, au moins à partir de la comparaison du point de vue, c'est à dire la clé.getEncoded() est la même. Le sel et le nombre d'itérations prennent effet lors du chiffrement du texte brut. Merci encore pour votre aide!
Excellent! (#1 était une blague.) Si vous avez trouvé la réponse utile, s'il vous plaît marquer. :^)
Je vais le faire. Cependant, ma réputation est trop faible. Je ne peux que l'accepter, mais ne peut pas marquer comme utile. Je suis très désolé, je ne pouvais pas le faire pour l'instant. Je promets de revenir et de le marquer 🙂
OriginalL'auteur tbroberg
Si vous utilisez
PBKDF2WithHmacSHA1
au lieu dePBEWithSHA1andDESede
votre hypothèse fonctionne comme il prend en charge le sel. Vous avez juste besoin d'ajouter lakeyLength
paramètrePBEKeySpec
:...
J'ai lancer un test et le résultat est:
false
.Toutefois, notez que pour le chiffrement et le déchiffrement de fonctionner correctement, vous devez utiliser le même sel et le nombre d'itérations lors de la génération de la clé.
OriginalL'auteur bozu