C - 具有 AES-256 和 CFB 模式的 OpenSSL
C - OpenSSL with AES-256 and CFB mode
我正在 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);
谢谢!
您正在一遍又一遍地加密同一个字节。在 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
我正在 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);
谢谢!
您正在一遍又一遍地加密同一个字节。在 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