AES加密 - 使用OpenSSL生成密钥

pim*_*ing 7 c encryption openssl aes

作为参考和作为帖子的延续: 如何使用OpenSSL解密Java AES加密数据?

我有以下问题.

我正在使用OpenSSL库和C编程来加密aes-cbc-128中的数据.我得到任何输入二进制数据,我必须加密它.

我了解到Java有一个CipherParameters接口来设置IV和KeyParameters.

有没有办法使用openSSL生成IV和密钥?简而言之,如何在C程序中使用openSSL的随机生成器来实现这些目的.你们中的任何人都可以提供一些文档/示例/链接吗?

谢谢

Tho*_*nin 14

AES密钥和用于对称加密的IV只是一堆随机字节.因此任何加密强大的随机数发生器都可以解决这个问题.OpenSSL提供了(这本身就什么操作系统提供饲料,如这样的随机数生成器CryptGenRandom()在Windows或/dev/random/dev/urandomLinux上).功能是RAND_bytes().所以代码看起来像这样:

#include <openssl/rand.h>

/* ... */
unsigned char key[16], iv[16];

if (!RAND_bytes(key, sizeof key)) {
    /* OpenSSL reports a failure, act accordingly */
}
if (!RAND_bytes(iv, sizeof iv)) {
    /* OpenSSL reports a failure, act accordingly */
}
Run Code Online (Sandbox Code Playgroud)

  • @pimmling:你没有设置种子.OpenSSL中的代码将使用操作系统在需要时获取所需的种子.如果`RAND_bytes()`报告错误,则意味着它无法获得足够的种子材料,这意味着_OS本身_没有种子,并且你可以做的很少,以避免这种情况.这在实践中不会发生,但如果它发生,那么你想要中止应用程序而不是静默使用弱随机值.只需调用`RAND_bytes()`,如果该函数返回0则中止. (3认同)

小智 2

假设 AES-128:

unsigned char key[16];
RAND_bytes(key, sizeof(key));

unsigned char iv[16];
RAND_bytes(iv, sizeof(iv));
Run Code Online (Sandbox Code Playgroud)

在使用其中之一之前,需要对随机生成器进行播种。

  • @pimmling:不,不,一千次不。`time(NULL)` 不包含足够的熵 - 如果你这样做,你的系统*将*变得非常不安全。 (3认同)