【问题标题】:C - OpenSSL with AES-256 and CFB modeC - 具有 AES-256 和 CFB 模式的 OpenSSL
【发布时间】:2015-03-24 21:13:55
【问题描述】:

我正在使用 Ubuntu 14.10 并尝试使用 C 和 OpenSSL 获得与使用命令相同的输出:

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); 

谢谢!

【问题讨论】:

    标签: c encryption openssl cryptography aes


    【解决方案1】:

    您一遍又一遍地加密同一个字节。在 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
    

    【讨论】:

    • 成功了!!!而且我还能够根据那个进行解密。但我不了解有关 bufsize 的一些信息。使用 bufsize = 256 它不适用于“abcdefghijklm”等其他字符串,我不得不将其增加到 512,那么 bufsize 代表什么,我应该如何选择它的大小?是否可以在执行过程中根据转码文本确定?
    • 更新——我不确定我做错了什么,但现在一切都在使用正确的 bufsize 我会说这是我的初始和最终字符串的“元素”数量拥有。
    猜你喜欢
    • 2015-08-04
    • 2018-08-02
    • 2020-09-26
    • 2011-03-09
    • 1970-01-01
    • 2019-02-15
    • 2022-08-17
    • 2017-08-28
    • 2014-09-11
    相关资源
    最近更新 更多