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) 创建了一个单独的和PBEParameterSpec然后将其传递给 Cipher.init() 的迭代计数。

所以,不,你没有做错任何事,你只是在盐和计数被塞进密码之前停下来。

于 2012-07-27T08:41:48.280 回答
3

如果您使用PBKDF2WithHmacSHA1而不是PBEWithSHA1andDESede您的假设,因为它支持盐。您只需将keyLength参数添加到PBEKeySpec

        String algo = "PBKDF2WithHmacSHA1";

...

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

我已经进行了测试,结果是:false.

但是,请注意,要使加密和解密正常工作,您需要在生成密钥时使用相同的盐和迭代计数。

于 2015-02-21T13:35:16.883 回答