我正在尝试使用密码块链接(CBC)模式对AES进行编码。我很确定我的结构是正确的(在将其发送到AES之前用新的明文写入以前的密文,当我解密时反向使用相反的。我遇到的问题是将加密文件解密回原始明文。我认为它可能与它的xored方式有关。我知道我的AES算法是正确的。我将两个字符数组放在一起。我知道如果你把两个东西放在一起然后xor其中一个回来的结果有了答案,你应该得到另一个操作数。但是,当我检查那个功能时,它不会那样工作。
我在明文中读到它,然后用前面的密文
来读取它//THERE IS A RANDOM INITIALIZATION VECTOR BEFORE GETTING INTO THE WHILE LOOP
while ((bytes_in = (read(fin, plaintext, AES_BLOCK)) ))
{
for (count = 0; count < AES_BLOCK; count++){
xor[count] = (plaintext[count]) ^ (ciphertext[count]);
}
//AES STUFF NOT SHOWN SO THERE ISN'T MUCH CODE
status = write (fdsk, ciphertext, strlen (ciphertext));
for (count =0; count < AES_BLOCK; count++)
plaintext[count] = '0';
}
解密部分:
bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector
while(total_bytes < aes_length)
{
bytes = read(fin, ciphertext, AES_BLOCK);
for(count = 0; count < AES_BLOCK; count++){
plaintext[count] = (xor[count]) ^ (previous_CT[count]);
printf("plaintext %d", plaintext[count]);
}
}
总结我的问题/问题: 我想知道是否有一些东西需要xoring我不知道我需要做什么。看起来我正在以正确的方式做到这一点但由于某种原因我没有得到正确的结果。我也想知道是否可能是我正在阅读信息的方式,这是搞乱我的程序。请帮帮我! 谢谢!
答案 0 :(得分:0)
如果问题中的代码确实是您正在使用的,那么问题是您在解密时并没有真正使用密文进行编码。您从文件中读取ciphertext
,但使用previous_CT
执行xor操作。
请看下面添加的评论:
// NOTE - here you read into `previous_CT`
bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector
while(total_bytes < aes_length)
{
bytes = read(fin, ciphertext, AES_BLOCK); // NOTE: here you read into `ciphertext`
for(count = 0; count < AES_BLOCK; count++){
plaintext[count] = (xor[count]) ^ (previous_CT[count]); // NOTE: using `previous_CT`
printf("plaintext %d", plaintext[count]);
}
}
答案 1 :(得分:0)
跳出来的错误就在这条线上:
status = write (fdsk, ciphertext, strlen (ciphertext)); // bug here
我很确定你真的想要:
status = write (fdsk, ciphertext, AES_BLOCK);
两个版本可能在很多时候产生相同的结果,但偶尔密码会在密文的中间某处生成字节'\ 0',然后第一个错误的版本会将写入截断为比您想要的更短的内容。 (同样的问题发生在XORing "Hello World!" cuts off string)。
我从xor操作
获得全部0只有在XOR操作的左侧和右侧具有完全相同的值时才会发生这种情况。 您是否可能意外地将数据复制到错误的缓冲区中,或者过早地复制数据供以后使用,最后是左侧和右侧的重复数据副本?