【问题标题】:is AES key random?AES 密钥是随机的吗?
【发布时间】:2012-04-20 19:33:16
【问题描述】:

此代码可能会生成 AES 密钥

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); 

但是

如果我有一个“非常可靠”的随机数生成方法,我可以这样使用它吗

SecureRandom rnd = new SecureRandom();
byte[] key = new byte[16];
rnd.nextBytes(key);

这种方法得到的key可靠吗?

或者它只能由一些特殊的算法生成

【问题讨论】:

标签: java aes


【解决方案1】:

AES 密钥可以是任意 128 位。它应该实际上是不可猜测的,无论创建它的方法是什么。

例如:

SecureRandom sr = new SecureRandom()

key = new byte[16];
iv = new byte[16];

sr.nextBytes(key);
sr.nextBytes(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(IV));

SecretKeySpec,顺便说一下,只是一个 byte[] 的薄包装——它不会以任何方式转换密钥。没有“特殊算法”。

【讨论】:

  • 这是我想听的,我希望这是真的:)
  • @user249654 是的。并且不要像问题中那样使用普通的java.util.Random,至少使用像 SecureRandom 这样的东西来避免快速暴力破解您的密钥。
  • @PaŭloEbermann 另请参阅 Thomas 的 this excellent question。它是安全的并不一定意味着它是生成密钥的最佳方法。
【解决方案2】:

补充其他答案...我认为基本 Random 函数不安全的原因有两个:

  1. 对于与安全无关的情况可以接受的轻微统计偏差,但对于安全应用程序而言,分布范围缩小到不可接受的程度。
  2. 它们由系统 DATETIME 播种。即使知道您何时生成密钥(精度差 +/- 6 个月)也会显着减少暴力搜索空间。

【讨论】:

  • 请注意,此答案是在 问题从 Random 更改为 SecureRandom 之前提供的 - 我认为这是作弊。
【解决方案3】:

您可以使用SecureRandom 添加随机算法:

    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    SecureRandom random = new SecureRandom(); // cryptograph. secure random 
    keyGen.init(random); 
    SecretKey secretKey = keyGen.generateKey();

【讨论】:

    【解决方案4】:

    听起来您正在尝试根据密码生成 AES 密钥。

    如果是这种情况,您可以使用 javax.crypto.SecretKeyFactory 的 generateSecret 方法,传入 javax.crypto.spec.PBEKeySpec 作为参数。 PBEKeySpec 允许将密码指定为其构造函数的参数。

    【讨论】:

    • 是的,但我不像 PBEKeySpec :)
    • 我不知道 PBEKeySpec 做了什么(在里面)? :)
    • PBEKeySpec 是 PBKDF2 的实现,这是一种标准算法,它使用多轮 hash algorithm 和 salt 来生成二进制密钥基于密码的给定长度。本质上,它是一个使用密码和盐作为种子的专用安全伪随机生成器。如果您正在生成安全随机数作为密钥,那么您就不需要它。如果您使用人类可记忆的密码来生成密钥,那么 PBKDF2 是防止字典攻击的不错选择。
    • 糟糕,我的编辑很草率。 SecretKeyFactory 可以根据PBEKeySpec 对象中指定的密码短语、盐、轮数和所需的密钥大小生成一个密钥。它使用几种标准算法中的任何一种来做到这一点。例如,一个是“PBKDF2WITHHMACSHA1”,这是 PBKDF2 算法的一种特定形式。
    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2020-03-20
    相关资源
    最近更新 更多