【问题标题】:In decryption using Java Cipher with "AES/CBC/PKCS5Padding", must IV be specified? and only SecretKeyFactory can be used?在使用带有“AES/CBC/PKCS5Padding”的 Java Cipher 进行解密时,是否必须指定 IV?并且只能使用 SecretKeyFactory 吗?
【发布时间】:2020-07-27 19:20:10
【问题描述】:

我阅读了一些关于使用 Java Cipher 加密和解密数据的示例。例如:

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(256, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, secretKey);

我有两个关于解密过程的问题。

  1. 虽然需要 IV,但我们可以使用 Cipher.init(Cipher.ENCRYPT_MODE, Key) 将其隐含。随机 IV 将自动应用到它。但是,在解密模式下,必须使用相同的 IV。这是否意味着应该只使用Cipher.init(int opmode, Key key, AlgorithmParameters params),并且应该从加密中获取IV,在此处存储和传递?

除了'''KeyGenerator''',我还看到了用'''SecretKeyFactory'''生成密钥的例子:

String key = ...
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
SecretKeySpec keySpec = factory.generateSecret(new DESKeySpec(key));

如果我将最后一行更改为

,我想我可以将它用于 AES
SecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(key,"AES"));
  1. 我对何时使用SecretKeyFactory 生成密钥以及何时使用KeyGenerator 感到困惑。似乎后者是生成随机密钥,前者是从给定的密钥材料生成的。那么是不是说在解密模式下只能使用 SecretKeyFactory 呢?

【问题讨论】:

    标签: java encryption jce jca


    【解决方案1】:

    这是否意味着应该只使用Cipher.init(int opmode, Key key, AlgorithmParameters params) 并且应该从加密中获取IV,在此处存储和传递?

    是的,就是这样,除非您能够通过其他方式进行交流。通常,尽管 IV 在加密期间是随机的,然后作为密文的前缀。对于 AES-CBC,它始终与块大小相同:16 字节。

    也就是说在解密模式下,只能使用SecretKeyFactory

    是的,虽然 AES 有一个简洁的小捷径;你可以这样做:

    SecretKey aesKey = new SecretKeySpec(keyBytes, "AES");
    

    并完成它。这是因为SecretKeySpec 实现了SecretKey。对于 3DES 密钥,这不是一个好主意,因为这意味着 DES 的奇偶校验位设置不正确。然而,诸如 AES 密钥和 HMAC 密钥之类的现代密钥仅由随机数据组成,因此对它们来说没问题。有一个警告:如果您尝试以这种方式在硬件设备中生成密钥,这将是一个问题:它必须保存在软件中。

    请注意,我不会深入探讨密钥管理以及如何创建密钥。我已经回答了这个问题here,尽管这个答案肯定还远未完成。哎呀,你可以使用骰子并通过电话分享我关心的数字:)

    【讨论】:

    • 感谢您的回答。 SecretKey aesKey = new SecretKeySpec(keyBytes, "AES") 有什么区别吗?和SecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(keyBytes,"AES")); ?我看到有些案例总是在获得 SecretKey 后再次使用 generateSecret。有必要还是没用?
    • 对于软件中的 AES 密钥,这真的无关紧要。我稍微喜欢工厂方法,因为硬件和软件技巧可能会使 AES 密钥更安全。但据我所知,目前还没有这样的诡计,所以......无论如何,太晚了,不能把我所有的时间都花在我的加密书上:)
    猜你喜欢
    • 2018-11-28
    • 2018-11-13
    • 2021-08-13
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2020-04-30
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多