gpt4 book ai didi

c - C 中的 AES CBC 模式

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:23 25 4
gpt4 key购买 nike

我尝试在 AES CBC 模式下加密和解密,但出现错误。

我的代码:

BYTE initVec[16] = {0x00};
BYTE message[16];
BYTE cipher[16];

for(r = 0; r < 16; r++){
int read2 = fread(cipher, 1, 16, fpIn); // Read last block
aes_decrypt(buffer, cipher, key); // Decrypt - buffer
buffer[r] = buffer[r] ^ cipher[r];
}

在第一个 block 之后,我需要将前一个密文 block 与当前 block 的其他 block 的解密数据进行异或。我怎样才能做到这一点?

最佳答案

一种方法是为 initVec 使用指针。最初,它指向初始 vector 。然后每次迭代后,改变指针指向上一轮的密文。 CBC本质上是指每个 block 的密文作为下一个 block 的初始 vector 。第一个 block 没有前一个 block ,因此存在一个特殊的 block :初始 vector 。

事实上,看一些代码,这正是我在 2001 年做的,当时 AES 是新的,我想 make my own :

加密:

void 
rijn_cbc_encrypt(rijn_keysched_t *sched, unsigned char *iv, unsigned char *out,
const unsigned char *in, size_t nblocks)
{
unsigned char *ivec = iv;
size_t blocksize = numrows_to_blocksize(sched->rijn_param.rijn_blockrows);
size_t i, nbytes = nblocks * blocksize;

for (i = 0; i < nbytes; i += blocksize) {
xor_mem(out + i, in + i, ivec, blocksize);
rijn_encrypt(sched, out + i, out + i);
ivec = out + i; /* <---- next block's ivec is this block's output! */
}

memcpy(iv, ivec, blocksize);
}

解密。在这里,我们在每次迭代的顶部创建一个 ivec 点,以在 i > 0 时指向前一个输入(密文) block 。对于第一次迭代,i == 0,我们将其指向 iv。很简单!

请注意,解密是通过数据向后进行的!

void 
rijn_cbc_decrypt(rijn_keysched_t *sched, unsigned char *iv, unsigned char *out,
const unsigned char *in, size_t nblocks)
{
rijn_block_t iv_save;
size_t blocksize = numrows_to_blocksize(sched->rijn_param.rijn_blockrows);
size_t i, nbytes = nblocks * blocksize;

if (nblocks > 0) {
memcpy(&iv_save, in + nbytes - blocksize, blocksize);

for (i = nbytes - blocksize; i < nbytes; i -= blocksize) {
const unsigned char *ivec = (i > 0) ? in + i - blocksize : iv;
rijn_decrypt(sched, out + i, in + i);
xor_mem(out + i, out + i, ivec, blocksize);
}

memcpy(iv, &iv_save, blocksize);
}
}

关于c - C 中的 AES CBC 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19578253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com