当前位置: 首页 > 知识库问答 >
问题:

在解密使用Java密码与"AES/CBC/PKCS5填充",必须指定IV吗?

党博超
2023-03-14

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

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);

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

  1. 虽然IV是必需的,但我们可以使用Cipher.init(Cipher.ENCRYPT_MODE,Key)将其保留为隐式。将自动对其应用随机IV。但是,在解密模式下,必须使用相同的IV。它是否只表示<code>密码。init(int opmode,Key Key,AlgorithmParameters params)应该使用,IV应该从加密中获取,存储并传递到这里

除了“KeyGenerator”之外,我还看到了使用“SecretKeyFactory”生成密钥的示例:

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

如果我将最后一行更改为

SecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(key,"AES"));

共有1个答案

江曦
2023-03-14

它是否只表示<code>密码。init(int opmode,Key Key,AlgorithmParameters params)应该使用,IV应该从加密中获取,存储并传递到这里?

是的,正是如此,除非您能够以其他方式进行通信。通常,虽然IV在加密期间是随机的,然后以密文为前缀。对于AES-CBC,它始终与块大小相同:16字节。

那么这是否意味着在解密模式下,只能使用密钥工厂

是的,尽管对于AES来说,有一个整洁的小捷径;你可以简单地做:

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

完成它。这是因为“代码”秘密密钥实现了“代码”秘密密钥。对于3DES密钥来说,这不是一个好主意,因为这意味着DES的奇偶校验位设置不正确。然而,现代密钥,如AES密钥和HMAC密钥,完全由随机数据组成,所以对于那些密钥来说没关系。有一个警告:如果你试图以这种方式在硬件设备中生成密钥,那将是一个问题:它必须保存在软件中。

注意,我不会过多地研究密钥管理和如何创建密钥。我在这里已经回答了这个问题,尽管这个答案肯定还远未完成。见鬼,你可以用骰子在电话上分享号码,我才不管呢:)

 类似资料:
  • 我正在尝试将java代码转换为NodeJs代码。这有点复杂,因为定制的格式包括密码和salt。 在main方法中有一个例子。 以下是我的java代码: 我正在尝试下面这样的JS代码,但不知道我做错了什么: 它抛出一个错误: 谢谢

  • 我一直在尝试用Python实现AES CBC解密。由于加密文本不是16字节的倍数,因此需要填充。没有填充,这个错误浮出水面 "TypeError:奇数长度字符串" 但我找不到在PyCrypto Python中实现PKCS5的适当参考。是否有任何命令来实现这一点?谢谢 在研究了马库斯的建议后,我这样做了。 我的目标实际上是使用此代码解密十六进制消息(128字节)。但是,输出 " ?:" 非常小,un

  • 我目前使用< code > AES/CBC/PKCS 5 Padding 对Java文件进行加密,密钥大小为256字节,但在搜索时,我在stack exchange PKCS # 5-PKCS # 7 Padding上发现了它, PKCS#5填充是8字节块大小的PKCS#7填充的子集 所以我想知道 > < li >对于上述配置,< code > AES/CBC/pkcs 7 padding 的性能

  • 问题内容: 我正在尝试在NodeJs中解密。它在Java中工作。但是我无法在Node中实现相同的功能。 节点版本:8.4 请找到我的NodeJs代码: 请找到有效的Java解密代码 我得到了不同的解密文本。在NodeJ中,我无法获得与Java中相同的结果。另外,我无法修改Java加密代码。所以我必须弄清楚Node中的解密。 你能帮我这个忙吗? 问题答案: 这是Java和Node.js中的完整示例,

  • 我试图在CBC模式下使用AES和Crypto++库加密(和解密)一个文件 以下是我已经做的: 为了加密文件,我以二进制模式打开它,并将内容转储为字符串: 当我将尝试解密此文件时,我如何分别提取iv和密文?IV是16字节长,但在这里我完全迷失了,我不知道如何做。

  • 问题内容: PHP加密功能 当我尝试使用下面的函数在Java中解密此结果时,我得到的只是“ Test @ string”,而我则是“ @@BKxnfÈ〜¯Ô’M”。有什么想法我错了吗?谢谢 问题答案: 编辑:从Java 8开始,Java现在包括可接受的Base64类。 这条线 看起来错了。而是使用apache commons编解码器类或Harder base64 类。同样,mcrypt使用的默认填