1

我在 cflib.org 上使用 genAESKeyFromPW() 函数已有一段时间了。我现在需要将其转换为纯 Java。我已经问过了,但决定在这里发布,看看我是否也能得到任何答案。

首先,看一下cflib.org 上的genAESKeyFromPW ()

看着我创建了以下 Java 代码进行测试。

String filename = new String("foo");
String salt = new String(Base64.encodeBase64(filename.getBytes()));
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(filename.toCharArray(),salt.getBytes(), 1024,128);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
System.out.println(new String(Base64.encodeBase64(secret.getEncoded())));

Java 代码返回uJvByU+ArEvtsb+7E1mblw==

调用 genAESKeyFromPW('foo',tobase64('foo')) 返回 7ZX9TKD8WVUlgTtbL/FN8w==

我知道可能存在字符编码问题。我尝试将 UTF8 和其他格式添加到 getBytes(),但还没有找到在 CF 和 Straight Java 中返回相同值的方法。

如果有人能对此有所了解,将不胜感激。

4

1 回答 1

2

尝试在两者中使用以下代码及其中的值:

    // The password
    String passwordString = "foo";

    // Base64 encoded random bytes used for the SALT.
    String saltString = "1234567890";

    char[] passwordChars = passwordString.toCharArray();
    byte[] saltBytes = Base64.decode(saltString);

    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    PBEKeySpec spec = new PBEKeySpec(passwordChars, saltBytes, 1024, 128);
    SecretKey secret = factory.generateSecret(spec);

    System.out.println(Base64.encodeBytes(secret.getEncoded()));
于 2013-05-30T20:04:48.043 回答