所以我试图用OpenSSL的EVP-API加密一些数据。但我没有收到与测试向量相同的结果。
这是主要功能
#include <stdio.h>
#include <windows.h>
#include <openssl\aes.h>
#include <openssl\evp.h>
int main()
{
unsigned char *to = (unsigned char*)malloc(2056);
ZeroMemory(to,2056);
int *tosize;
unsigned char* key = (unsigned char*)"0000000000000000000000000000000000000000000000000000000000000000";
unsigned char* iv = (unsigned char*)"00000000000000000000000000000000";
unsigned char* plain = (unsigned char*)"00000000000000000000000000000000";
to = AESEncrypt(key,iv,plain,strlen((const char*)plain));
if (to != 0)
{
for (int i = 0; i < strlen((const char*)to);i++)
{
printf("%x02", (int*)UCHAR(to[i]));
}
}
}
这是我试图打电话的功能。没有错误收到。每次通话都是真的(没有错误)。
unsigned char* AESEncrypt(unsigned char* key, unsigned char*iv, unsigned char*plain, size_t plainsize)
{
EVP_CIPHER_CTX *x = (EVP_CIPHER_CTX*) malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(x);
if (EVP_EncryptInit(x,EVP_aes_256_cbc(),key,iv))
{
unsigned char* to = (unsigned char*) malloc(plainsize + EVP_CIPHER_CTX_block_size(x));
int tosize = 0;
if(EVP_EncryptUpdate(x,to,&tosize,plain,plainsize))
{
if (EVP_EncryptFinal(x,to,&tosize))
{
return to;
}
}
}
return 0;
}
这是测试向量:
KEY = 0000000000000000000000000000000000000000000000000000000000000000
IV = 00000000000000000000000000000000
PLAINTEXT = 80000000000000000000000000000000
CIPHERTEXT = ddc6bf790c15760d8d9aeb6f9a75fd4e
这是我收到的: CIPHERTEXT = 5a0215028e ....然后继续。如你所见,这是不正确的。
我可能做错了什么?
答案 0 :(得分:4)
CAVS测试向量遵循相当直接的模式。从测试到测试,它们在一定程度上有所不同,但有一点非常一致:
十六进制字符串是BYTE表示;不是字符数据
因此,你的“测试”是完全错误的。您使用的是填充了字符“0”的键,iv和纯文本,而不是字节值 0 。所以显然难怪你得到不同的结果。
对于特定的测试,你的数组应该是:
unsigned char key[64] = {0};
unsigned char iv[16] = {0};
unsigned char plain[16] = {0};
此外,发送到加密函数的大小应该是纯文本的字节数。最后,理想情况下,加密函数应采用目标缓冲区和可修改大小作为输出参数。
int AESEncrypt256(
unsigned char* key, // key must be 64 bytes wide.
unsigned char *iv, // IV must be 16 bytes wide.
unsigned char *src, // source buffer to encryt
unsigned int src_len, // length of source buffer in bytes
unsigned char *dst, // target buffer to write to
unsigned int *dst_len); // in: size of dst, out: bytes written to dst
编写函数以匹配这些参数。你会很高兴的。
CAVS测试向量不是“文本”。它们是字节,应该这样对待。你现在需要掌握它,因为蒙特卡洛测试可能会花费你一些头发,如果你不这样做。
给自己一个巨大的青睐并编写一些代码现在,将一串十六进制数字转换为unsigned char
字节数组。您需要使用相同的内容来翻译结果字符串。并且在编写这些测试时,将这些例程 solid ,因为您将使用 lot 。
扰流警报
测试字符串是否为奇数个字符 first 。如果是奇数,则翻译缓冲区中的第一个字节应基于0c
,其中c
是输入字符串中的第一个char
。从那时起(或者如果字符的数量是偶数,那么从一开始)在将剩余的字节字符串转换为实际字节时一次两次地抓取它们。这意味着这个
123456
产生
的字节数组{ 0x12, 0x34, 0x56 }
虽然:
89AB1
应该是:
{0x08, 0x9A, 0xB1 }