首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加密串与测试向量不同

加密串与测试向量不同
EN

Stack Overflow用户
提问于 2013-01-07 08:25:12
回答 1查看 310关注 0票数 1
代码语言:javascript
复制
#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]));
        }

    }
}

这就是我要调用的函数。

代码语言:javascript
复制
 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;
}

代码语言:javascript
复制
KEY = 0000000000000000000000000000000000000000000000000000000000000000
IV = 00000000000000000000000000000000
PLAINTEXT = 80000000000000000000000000000000
CIPHERTEXT = ddc6bf790c15760d8d9aeb6f9a75fd4e

这就是我所收到的: CIPHERTEXT = 5a0215028e....而且它还在继续。如你所见,它是不正确的。

我能做错什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-07 08:54:16

CAVS测试向量遵循相当简单的模式。在不同的测试中,它们在一定程度上有所不同,但有一点是非常一致的:

十六进制字符串是字节表示形式,而不是字符数据

因此,你的“测试”是完全错误的。您使用的是一个键、iv和纯文本,其中填充了字符'0',而不是字节值。所以显然难怪你会得到一个不同的结果。

对于该特定测试,您的阵列应为:

代码语言:javascript
复制
unsigned char key[64] = {0};
unsigned char iv[16] = {0};
unsigned char plain[16] = {0};

此外,发送到加密函数的大小应该是纯文本的字节数。最后,理想情况下,您的加密函数应该将目标缓冲区和可修改的大小作为输出参数。

代码语言:javascript
复制
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,因为您将在编写这些测试时经常使用它们。

剧透警报

首先测试字符串中是否有奇数个字符。如果是奇数,那么翻译后的缓冲区中的第一个字节应该基于0c,其中c是输入字符串中的第一个char。从那时起(或者如果字符数是偶数,则从一开始),在将字节字符串的其余部分转换为实字节时,一次获取两个字符。这意味着

代码语言:javascript
复制
123456

产生一个字节数组,该数组的

代码语言:javascript
复制
{ 0x12, 0x34, 0x56 }

而这一点:

代码语言:javascript
复制
89AB1

应该是:

代码语言:javascript
复制
{0x08, 0x9A, 0xB1 }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14188293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档