2011-04-07 313 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