PBEの暗号化/復号化をテストしようとしています。私は、PBEが異なる塩と繰り返し回数で同じ鍵を生成することを発見しました。もちろん、使用するパスワードは同じです。 私が理解しているように、同じパスワードと異なるsalt/iterationは異なるキーを取得する必要があります。以下 は私のテストコードです:なぜPBEは異なる塩と繰り返し回数で同じ鍵を生成するのですか?
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));
}
}
私は最終的な出力がfalse
で期待しています。 私は何か悪いことをしましたか?
あなたの返信にtbrobergさんありがとうございます。 1、 "塩と反復カウントがちょうど一致した"。塩分と反復回数は無作為に生成されています。この試験では、実行ごとに一致するとは思えません。 2「あなたはちょうど塩の前に止まり、数は暗号に詰め込まれました」。暗号化/復号化が実行されているときにのみ、塩分と反復カウントが有効になるのでしょうか? 3、私はキーが常に "70 61 73 73 77 6f 72 64"であることを発見しました。私はそれが "パスワード"のためだと思っています。それは塩分や反復回数と関係がありません。それは正しい結果ですか? – Michael
#2と#3は状況を説明しているようです。テキストを暗号化しようとしましたが、暗号化されたデータは毎回異なります。私の結論は次のとおりです。SecretKeyFactory.generateSecret()によって生成されたキーは、パスワードにのみ関連しています。これは少なくとも比較の観点からは真実です。つまり、key.getEncoded()は同じです。塩と反復回数は平文を暗号化するときに有効になります。あなたの助けをもう一度ありがとう! – Michael
優秀! (#1は冗談だった。)あなたが答えを見つけたら、それに印を付けてください。 :^) – tbroberg