如何处理 AES_set_encrypt_key 个短键
How handles AES_set_encrypt_key short keys
我正在编写一组工具,其中 C++ 应用程序使用 AES 加密标准对数据进行编码,然后 java 应用程序对其进行解码。据我所知,密钥长度必须为 16 个字节。但是当我尝试使用不同长度的密码时,我遇到了 AES_set_encrypt_key
函数的以下行为:
- length = 16 : 正如预期的那样,没有什么特别的事情发生
- length > 16 : 密码在第十六个字符后被截断
- length < 16 : 密码好像已经填好了"magical"
那么,有人知道最后一个案例到底发生了什么吗?
顺便说一句:Java 如果密码不正好是 16 个字符长则抛出异常
谢谢,
罗伯特
不要将字节数组与 C 字符串混淆。每个 C 字符串都是字节数组,但并非每个字节数组都是 C 字符串。
AES 的概念是使用 "KEY"。它就像密码一样,但概念有点不同。它具有固定大小,在您的情况下必须为 16 个字节。
密钥是一个 16 字节的字节数组,不是 C 字符串。这意味着它可以在缓冲区中的任何点具有任何值,而 C 字符串必须以 null 结尾(内容末尾的 '[=10=]'
)。
当您将 C 字符串提供给 AES 时,它仍会将其解释为缓冲区,并忽略途中的任何 [=11=]
字符。换句话说,如果你的字符串是 "something"
,缓冲区实际上是 "something[=13=]??????"
,其中“??????”这里指的是不能保证一直有效的任何随机垃圾字节。
为什么密钥长度 < 16 有效?在调试模式下,当您启动缓冲区时,它通常会保留一个在您的案例中重复的默认值。但它根据编译器 and/or 平台而变化,所以接受。
并且密钥长度 > 16,AES 仅选取缓冲区的前 16 个字节并忽略其余字节。
我正在编写一组工具,其中 C++ 应用程序使用 AES 加密标准对数据进行编码,然后 java 应用程序对其进行解码。据我所知,密钥长度必须为 16 个字节。但是当我尝试使用不同长度的密码时,我遇到了 AES_set_encrypt_key
函数的以下行为:
- length = 16 : 正如预期的那样,没有什么特别的事情发生
- length > 16 : 密码在第十六个字符后被截断
- length < 16 : 密码好像已经填好了"magical"
那么,有人知道最后一个案例到底发生了什么吗?
顺便说一句:Java 如果密码不正好是 16 个字符长则抛出异常
谢谢, 罗伯特
不要将字节数组与 C 字符串混淆。每个 C 字符串都是字节数组,但并非每个字节数组都是 C 字符串。
AES 的概念是使用 "KEY"。它就像密码一样,但概念有点不同。它具有固定大小,在您的情况下必须为 16 个字节。
密钥是一个 16 字节的字节数组,不是 C 字符串。这意味着它可以在缓冲区中的任何点具有任何值,而 C 字符串必须以 null 结尾(内容末尾的 '[=10=]'
)。
当您将 C 字符串提供给 AES 时,它仍会将其解释为缓冲区,并忽略途中的任何 [=11=]
字符。换句话说,如果你的字符串是 "something"
,缓冲区实际上是 "something[=13=]??????"
,其中“??????”这里指的是不能保证一直有效的任何随机垃圾字节。
为什么密钥长度 < 16 有效?在调试模式下,当您启动缓冲区时,它通常会保留一个在您的案例中重复的默认值。但它根据编译器 and/or 平台而变化,所以接受。
并且密钥长度 > 16,AES 仅选取缓冲区的前 16 个字节并忽略其余字节。