2015-03-24 41 views
2

我工作在Ubuntu 14.10,我試圖讓用C和OpenSSL相同的輸出,我會得到使用下面的命令:Ç - OpenSSL的帶有AES-256和CFB模式

openssl enc -aes-256-cfb8 -in test -out test.enc -K $key -iv $iv 

我一直在這兩天工作,但沒有得到它,加密工作,但它不是我應該得到的。

我的代碼是:

int outlen, inlen; 

unsigned char inbuf[BUFSIZE] , outbuf[BUFSIZE]; 

strcpy(inbuf,text); 

EVP_CIPHER_CTX ctx; 
EVP_CIPHER_CTX_init(&ctx); 

EVP_EncryptInit_ex(&ctx, EVP_aes_256_cfb8(), NULL, key, iv); 

int i =0; 
int n = strlen(text); 
for(i; i < n; i++) {  

    if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, 1)) 
     return 0; 
}  

if(!EVP_EncryptFinal(&ctx, outbuf, &outlen)) 
    return 0; 

EVP_CIPHER_CTX_cleanup(&ctx); P_EncryptFinal(&ctx, outbuf, &outlen)) 
    return 0; 

EVP_CIPHER_CTX_cleanup(&ctx); i < n; i++) {  

    if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, 1)) 
     return 0; 
}  

if(!EVP_EncryptFinal(&ctx, outbuf, &outlen)) 
    return 0; 

EVP_CIPHER_CTX_cleanup(&ctx); 

謝謝!

回答

4

您一次又一次地加密相同的字節。在EVP_EncryptUpdate中,必須將inbuf指針沿着每個輸入字節移動,並且必須將outbuf指針移至新內存。我做了小的改動你的代碼(並完成它足以運行):

#include <stdio.h> 
#include <openssl/ssl.h> 

#define BUFSIZE 256 

int doit(char* text, char* key, char* iv) 
{ 
    int outlen, inlen; 

    unsigned char inbuf[BUFSIZE] , outbuf[BUFSIZE]; 

    strcpy(inbuf,text); 

    EVP_CIPHER_CTX ctx; 
    EVP_CIPHER_CTX_init(&ctx); 

    EVP_EncryptInit_ex(&ctx, EVP_aes_256_cfb8(), NULL, key, iv); 

    int i =0; 
    int n = strlen(text); 
    unsigned char* p = outbuf; 
    for(i; i < n; i++) {  

     if(!EVP_EncryptUpdate(&ctx, p, &outlen, &inbuf[i], 1)) 
      return 0; 
     p += outlen; 
    }  

    if(!EVP_EncryptFinal(&ctx, p, &outlen)) 
     return 0; 
    p += outlen; 

    EVP_CIPHER_CTX_cleanup(&ctx); 

    outlen = p - outbuf; 
    for (n = 0; n < outlen; n++) 
     printf("%c", outbuf[n] & 0xff); 
} 

int main() 
{ 
    char* key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; 
    char* iv = "BBBBBBBBBBBBBBBB"; 
    doit("hello world", key, iv); 
} 

C代碼想要的密鑰和IV字節,但OpenSSL的命令行想要十六進制字符。此命令行,會得到相同的結果上面的C代碼:

openssl enc -aes-256-cfb8 -in test -out test.enc -K 4141414141414141414141414141414141414141414141414141414141414141 -iv 42424242424242424242424242424242 

當然,你需要設置完全相同的明文:

$ echo "hello world" > test 
$ truncate --size 11 test # remove newline at end 
+0

它的工作!而且我也能夠根據那個進行解密。但我不瞭解關於bufsize的一些事情。使用bufsize = 256它不適用於像「abcdefghijklm」這樣的其他字符串,我不得不將它增加到512,那麼什麼是bufsize表示,我應該如何選擇它的大小?是否有可能在執行時根據要編碼的文本來確定它? – ur3k 2015-03-25 15:09:00

+0

更新 - 我不確定我做錯了什麼,但現在所有的工作都是正確的bufsize,我會說它是我的初始和最終字符串將會有的「元素」的數量。 – ur3k 2015-03-25 18:33:59