7

PBE 暗号化/復号化をテストしようとしています。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

2 に答える 2

6

あなたは非常に幸運で、ランダム ソルトと反復回数がたまたま一致しました。ラスベガスへ直行。今。;)

私は PBEWithSHA1andDESede をグーグル検索し、この例を追跡しました: http://cryptofreek.org/2010/06/04/encrypting-and-decrypting-files-with-javaここで、彼はキーを単独で指定し、ソルトを使用しnew PBEKeySpec(password) て別のものを作成し、 PBEParameterSpecCipher.init() に渡される反復回数。

つまり、いいえ、あなたは何も悪いことをしていません。ソルトとカウントが暗号に詰め込まれる前に停止しただけです。

于 2012-07-27T08:41:48.280 に答える
3

PBKDF2WithHmacSHA1仮定の代わりに使用するPBEWithSHA1andDESedeと、salt がサポートされるため機能します。keyLengthパラメータをに追加するだけですPBEKeySpec

        String algo = "PBKDF2WithHmacSHA1";

...

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

テストを実行しましたが、結果は次のとおりfalseです。

ただし、暗号化と復号化が適切に機能するには、キーを生成するときに同じソルトと反復回数を使用する必要があることに注意してください。

于 2015-02-21T13:35:16.883 に答える