使用种子值生成AES密钥

时间:2009-05-14 05:20:31

标签: blackberry encryption java-me aes

如何使用种子值生成AES密钥,以便每当我生成具有相同种子值的密钥时,我都能获得相同的AES密钥?

我想为Blackberry Pearl 8100设备生成此密钥。

我无法使用AESKey(keyData)生成AES密钥。

每当我以String或byte []的形式打印它时,我都无法生成它。(打印它)实际的键永远不会被打印。

获取密钥可以做些什么?

更新

我尝试通过传递我的数据的byte []来生成AESKey,如下所示:

 AESKey key = new AESKey(keyData);

每次我得到相同的密钥,这是正确的。

现在使用这个密钥我正在加密数据。每次我加密我得到不同的加密值。这是我的问题。如何在加密后每次都获得相同的数据,以便我可以将其发送到服务器?

更新

我无法使用AESKey(keyData)生成AES密钥。

每当我以String或byte []的形式打印它时,我都无法生成它。(打印它)实际的键永远不会被打印。

获取密钥可以做些什么?

3 个答案:

答案 0 :(得分:7)

RFC 2898中的第5.2节描述了这样做的一种方式。

具体而言,“种子”值由“PA​​SSPHRASE”和“SALT”组成;但是如果使用相同的密码和盐,将始终产生相同的密钥。

http://anandam.name/pbkdf2/是一个javascript实现。

http://en.wikipedia.org/wiki/PBKDF2包含更多信息,以及指向其他实施的链接。

答案 1 :(得分:0)

无法以安全的方式完成。你不应该生成这样的加密密钥,特别是如果你打算用结果密钥保护任何重要的东西。尽管如此,这样做的基本算法看起来像这样(许多增强都是可能的,但没有一个能使它真正安全):

  1. 选择随机数生成器;可能Java有一个人们通常使用的内置。
  2. 使用特定输入值初始化(种子)随机数生成器(密码短语?密码短语?类似的东西)。
  3. 获取RNG输出的第一个N个字节;那些是你的加密密钥。只要您在步骤2中使用相同的值播种,生成的第一个N字节将始终相同。
  4. 使用不同的值重新设置RNG,最好是随机值(例如,在Python中,您将使用None种子;这会告诉机器选择任何随机种子。)

答案 2 :(得分:0)

我需要更多信息,所以这是猜测。

你是如何使用AESKey的?如果您正在使用CBC加密(即使用net.rim.device.api.crypto.CBCEncryptorEngine),那么每个调用的初始化向量也必须相同。使用CBCEncryptorEngine的构造函数,它接受InitializationVector和BlockEncryptorEngine。

Wikipedia article了解更多信息,了解其原因。