【问题标题】:Generate AES key with seed value生成带有种子值的 AES 密钥
【发布时间】:2009-05-14 05:20:30
【问题描述】:

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

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

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

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

如何获取密钥?

更新

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

 AESKey key = new AESKey(keyData);

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

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

更新

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

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

如何获取密钥?

【问题讨论】:

  • 您说的是特定平台吗?您的标签暗示您在谈论嵌入式 Java,但您能明确说明吗?

标签: blackberry encryption java-me aes


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是否有任何链接或网址来实现这一切。你的回答真的很有用。谢谢巴皮
    • 感谢 KQuinn 的快速回复
    • 一直在做。它称为基于密码的加密。安全密钥派生算法在 PKCS #5 中定义。
    【解决方案3】:

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

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

    Wikipedia article 详细了解为什么会这样。

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 2018-05-31
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多