4

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

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

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

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

可以做些什么来获得密钥?

更新

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

 AESKey key = new AESKey(keyData);

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

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

更新

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

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

可以做些什么来获得密钥?

4

3 回答 3

8

RFC 2898中的第 5.2 节描述了一种执行此操作的方法。

具体来说,“种子”值由“密码”和“盐”组成;但是给定相同的密码和盐,总是会产生相同的密钥。

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

http://en.wikipedia.org/wiki/PBKDF2有更多信息,以及其他实现的链接。

于 2009-05-14T06:46:41.370 回答
1

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

  1. 选择一个随机数生成器;可能Java内置了人们通常使用的一个。
  2. 使用特定的输入值(密码?密码的哈希?类似的东西)初始化(种子)随机数生成器。
  3. NRNG输出的第一个字节;这些是您的加密密钥。只要您在步骤 2 中使用相同的值作为种子,N生成的第一个字节将始终相同。
  4. 使用不同的值重新设置 RNG 的种子,最好是随机值(None例如,在 Python 中,您将使用 种子;它告诉机器选择任何随机种子)。
于 2009-05-14T06:07:56.550 回答
0

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

您如何使用您的 AESKey?如果您使用 CBC 加密(即使用 net.rim.device.api.crypto.CBCEncryptorEngine)进行操作,那么每次调用的初始化向量也必须相同。使用带有 InitializationVector 和 BlockEncryptorEngine 的 CBCEncryptorEngine 的构造函数。

维基百科文章提供了更多关于为什么会这样的信息。

于 2009-05-14T16:03:35.120 回答