我正在尝试使用php和c创建openssl aes加密/解密。我能够使用php和openssl加密文本,这将输出base64字符串中的加密字符串。我试图将这个base64编码的字符串传递给c程序,使用c中的openssl对其进行解码。
int decrypt(unsigned char *ciphertext,
int ciphertext_len,
unsigned char *key,
unsigned char *iv,
unsigned char *plaintext)
{
EVP_CIPHER_CTX *ctx;
int len;
int plaintext_len;
/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
handleErrors();
if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
handleErrors();
plaintext_len = len;
if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
plaintext_len += len;
/* Clean up */
EVP_CIPHER_CTX_free(ctx);
return plaintext_len;
}
有没有方法可以在c中使用openssl解密base64字符串?我可以使用类似
的命令行解密它openssl enc -aes-256-cbc -d -in file.encrypted -nosalt -nopad -K 31323334353637383132333435363738 -iv 31323334353637383132333435363738
提前致谢
答案 0 :(得分:1)
您正在直接处理base64编码数据。 首先,您需要对数据进行base64解码以获取实际的加密数据。然后,您将应用AES解密来获取解密数据
BIO *b64, *bmem;
buffer = (char *)malloc(datalength);
b64 = BIO_new(BIO_f_base64());
if(b64 == NULL)
{
return NULL;
}
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bmem = BIO_new_mem_buf(input, length);
if(bmem == NULL)
{
return NULL;
}
bmem = BIO_push(b64, bmem);
if(bmem == NULL)
{
return NULL;
}
ret = BIO_read(bmem, buffer, length);
if(ret == 0)
{
return NULL;
}
BIO_free_all(bmem);
return buffer;