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

如何从AES-256切换到AES-128?

羊舌勇
2023-03-14

关于AES有很多问题,但我有以下问题。我目前正在使用以下 AES 实现来加密数据

byte [] PRFkey = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
byte [] plaintext = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

SecretKeySpec encryptionKey=new SecretKeySpec(PRFkey, "AES");
Cipher cipher=Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
byte[] encryptedData=cipher.doFinal(plaintext);

结果是32字节(256位)。所以我使用的是AES-256。这个实现对我来说太慢了。我如何切换到AES-128?我不需要任何填充或操作模式或密钥散列。

提前谢谢你。

共有2个答案

朱欣荣
2023-03-14

这里对堆栈溢出提出了类似的问题,这将有助于为您提供所需的信息。重要的一点是,JCA参考指南说:

(创建Cipher对象)如果未指定模式或填充,则使用模式和填充方案的提供程序特定的默认值。例如,SunJCE提供程序使用ECB作为默认模式,使用PKCS5Padding作为DES、DES-EDE和Blowfish密码的默认填充方案。这意味着对于SunJCE提供者:Cipher.getInstance("DES ")和cipher . getinstance(" DES/ECB/pkcs 5 padding ")是等价的语句。

因此,由于您仅指定“AES”作为转换,因此Oracle JDK 7的AES的默认密码是“AES/ECB/PKCS5Padding”,链接。

此外,Cipher类定义了转换“AES/ECB/NoPadding ”,这将为您的< code>encryptedData获得一个非填充的16字节值。ECB是AES的默认模式,您也可以选择“AES/CBC/NoPadding”。

施永宁
2023-03-14

您已经在使用128位AES。这由您传递给Cipher.init()的密钥长度决定,在您的示例中为16个字节(128位)。

输出的大小将取决于您的填充模式(以及输入数据的大小)。由于您忽略了指定操作模式或填充,因此您的 JCE 提供程序可能默认为“AES/ECB/PKCS5Padding”。PKCS #5 填充将始终为您的输出大小添加一个额外的块,因此您收到了 32 字节的输出,而不是 16 字节。

绝不允许您的提供商为您选择默认值。相反,请显式指定模式和填充:

Cipher cipher=Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
byte[] encryptedData=cipher.doFinal(plaintext);  // will be 16 bytes

请记住,如果指定不填充,输入数据必须始终是16字节的精确倍数。还要注意,ECB模式具有相同的明文值将产生相同的密文值的特性。这在密码系统中很少需要。

 类似资料:
  • 我正在重写代码以与PHP 7.2兼容 根据我的研究,新代码应该是这样的 但我尝试了openssl_encrypt选项的每一种组合:、、

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 问题内容: 我有下面的Java代码来加密使用64个字符的密钥的字符串。我的问题是这将是AES-256加密吗? 以下是结合了divanov和laz建议的代码。 问题答案: 是的,它将是64个字符,即32个字节和256位,并且256位的任何序列都可以用作AES-256密钥。 我建议您使用DatatypeConverter.parseHexBinary(或您选择的库中的类似实用程序)将十六进制字符串转换

  • 我想将下面的PHP脚本转换为dart,我尝试了很多案例,但没有任何帮助。 我试过以下代码;但在这里抛出一个异常加密程序。解密方法。 演示内容; 初始化aes_密码 $aes_secret='123456ac'; 演示内容; ="dBluiiVaHxhRcWJPaEip9kCGXDwufk3mFp8Xe9ioh9UKu6xL CHUZrKvuf3xI7P1vFpvyJ2Vz2Q3ieLEuRHk7N

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 最近,我终于(在stackoverflow的用户@WhozCraig的帮助下)开始在CBC模式下使用AES。现在,我想用AES IGE做同样的事情。我看了并尝试构建自己的测试。但是,我再次遇到了输入和输出大小合适的问题。其他一切都很好,因为我从以前的代码中复制了它:AES(aes-cbc-128、aes-cbc-192、aes-cbc-256)使用openssl C进行加密/解密。 现在,当我传递