2012-07-26 9 views
7

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で期待しています。 私は何か悪いことをしましたか?

答えて

4

あなたは驚くほど幸運に思っています。あなたのランダムな塩と反復回数は、ちょうど一致したばかりです。ラスベガスに直接行く。今。 ;)

私はPBEWithSHA1andDESedeのためにGoogleで検索して、この例を突き止め:http://cryptofreek.org/2010/06/04/encrypting-and-decrypting-files-with-java彼はnew PBEKeySpec(password)と二人きりのキーを指定して)、その後Cipher.init(に渡される塩と繰り返し回数を使用して別のPBEParameterSpecを作成することを特徴とします。

だから、あなたは何も間違っていませんでした。あなたはちょうど塩の前に止まり、数は暗号に詰め込まれました。

+0

あなたの返信にtbrobergさんありがとうございます。 1、 "塩と反復カウントがちょうど一致した"。塩分と反復回数は無作為に生成されています。この試験では、実行ごとに一致するとは思えません。 2「あなたはちょうど塩の前に止まり、数は暗号に詰め込まれました」。暗号化/復号化が実行されているときにのみ、塩分と反復カウントが有効になるのでしょうか? 3、私はキーが常に "70 61 73 73 77 6f 72 64"であることを発見しました。私はそれが "パスワード"のためだと思っています。それは塩分や反復回数と関係がありません。それは正しい結果ですか? – Michael

+0

#2と#3は状況を説明しているようです。テキストを暗号化しようとしましたが、暗号化されたデータは毎回異なります。私の結論は次のとおりです。SecretKeyFactory.generateSecret()によって生成されたキーは、パスワードにのみ関連しています。これは少なくとも比較の観点からは真実です。つまり、key.getEncoded()は同じです。塩と反復回数は平文を暗号化するときに有効になります。あなたの助けをもう一度ありがとう! – Michael

+0

優秀! (#1は冗談だった。)あなたが答えを見つけたら、それに印を付けてください。 :^) – tbroberg

3

PBEWithSHA1andDESedeの代わりにPBKDF2WithHmacSHA1を使用すると、塩をサポートしているとみなされます。あなただけのPBEKeySpeckeyLengthパラメータを追加する必要があります。

 String algo = "PBKDF2WithHmacSHA1"; 

...

 PBEKeySpec decPBESpec = new PBEKeySpec(password, salt, iterationCount, 128); 

私がテストを実行していると、結果は次のとおりです。false

ただし、暗号化と復号化が正しく機能するためには、鍵を生成するときに同じ塩と繰り返し回数を使用する必要があります。

関連する問題