2011-04-07 395 views
6

作为参考并作为延续到后: how to use OpenSSL to decrypt Java AES-encrypted data?AES加密 - 密钥生成与OpenSSL的

我有以下几个问题。

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

我知道Java有一个CipherParameters接口来设置IV和KeyParameters。

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

由于

回答

2

假设AES-128:

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

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

随机发生器需要使用的those一个前接种。

+0

关于“随机种子”的wiki快速阅读说,这是您提供的用于启动随机生成器的初始值。从Thomas Pornin的msg中,我看到OpenSSL从/ dev/urandom中选择了这个种子?在Linux上。然后如何设置它与RAND_seed(const void * buf,int num)??? – pimmling 2011-04-07 13:05:53

+0

#include unsigned char rnd_seed =(unsigned char)time(NULL)); RAND_seed(rnd_seed,sizeof rnd_seed); 这个怎么样? – pimmling 2011-04-07 13:59:41

+3

@ pimmling:不,不,一千次不。 '时间(NULL)'不包含足够的熵 - 如果你这样做了,你的系统*将变得不安全。 – caf 2011-04-10 12:40:52

12

AES密钥和对称加密的IV只是一堆随机字节。所以任何密码学上强大的随机数发生器都可以做到这一点。 OpenSSL提供了这样一个随机数生成器(它本身可以在任何操作系统上提供,例如Windows上的CryptGenRandom()或Linux上的/dev/random/dev/urandom)。该功能是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 */ 
} 
+0

非常感谢。我正在使用Linux系统,应该如何在代码中调用dev/urandom? – pimmling 2011-04-07 13:01:10

+0

@pimmling:你不使用'/ dev/urandom','RAND_bytes()'的实现为你做。如果直接使用'/ dev/urandom'(放弃Windows世界的可移植性),那么这只是一个你打开并读取的文件(一个特殊的文件,但仍被看作是一个文件)(因此'fopen()', 'fread()'和'fclose()')。调用'RAND_bytes()'更容易(一次函数调用而不是三次),并且更加便携(OpenSSL将使用适当的操作系统提供的RNG,无论是Linux上的/ dev/urandom还是其他系统上的其他内容)。 – 2011-04-07 13:17:20

+0

噢,好的。但是,我如何设置种子价值?当我看着openSSL代码时,我看到他们设置了一个const字符串,并简单地做了一个RAND_seed(string,sizeof string)。我应该做这样的事吗?而这些RAND_bytes产生一个真正的随机数而不是伪随机数? – pimmling 2011-04-07 13:48:20