如何处理AES_set_encrypt_key短键

时间:2015-01-30 00:08:22

标签: c++ openssl

我正在编写一组工具,其中c ++应用程序使用AES加密标准对数据进行编码,并且Java应用程序对其进行解码。据我所知,密钥长度必须是16个字节。但是当我尝试使用不同长度的密码时,我遇到了AES_set_encrypt_key函数的以下行为:

  • length = 16:没有特别的事情发生,正如预期的那样
  • 长度> 16:密码在第16个字符后被删除
  • 长度< 16:密码似乎已填满"魔法"

那么,有人知道最后一种情况究竟发生了什么吗?

顺便说一句:如果密码不完全是16个字符,Java会抛出异常

谢谢, 罗伯特

1 个答案:

答案 0 :(得分:2)

不要将字节数组与C-String混淆。每个C-String都是一个字节数组,但不是每个字节数组都是C-String。

AES的概念是使用" KEY"。它就像一个密码,但概念有点不同。它有一个固定的大小,在你的情况下必须是16个字节。

密钥是一个16字节的字节数组,不是C字符串。这意味着它可以在缓冲区中的任何位置具有任何值,而C-String必须以空值终止(内容末尾的'\0')。

当您为AES提供C-String时,它仍将其解释为缓冲区,忽略路上的任何\0字符。换句话说,如果你的字符串是"something",那么缓冲区实际上是"something\0??????",其中" ??????"这里的意思是任何随机垃圾字节无法保证始终有效。

为什么密钥长度< 16正在工作?在调试模式下,当您启动缓冲区时,它通常会保留一个在您的案例中重复的默认值。但它会根据编译器和/或平台的变化而变化,所以请采取。

密钥长度> 16,AES只是选择缓冲区的16个第一个字节而忽略其余的字节。