gpt4 book ai didi

c - 在 C 中异或问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:03 24 4
gpt4 key购买 nike

我正在尝试使用密码 block 链接 (CBC) 模式对 AES 进行编码。我很确定我的结构是正确的(在将其发送到 AES 之前将之前的密文与新的明文进行异或运算,解密时则相反。我遇到的问题是将加密文件解密回原始明文。我认为它可能与异或的方式有关。我知道我的 AES 算法是正确的。我将两个字符数组异或在一起。我知道如果你将两件事异或的结果放在一起,然后将其中一个异或回来有了答案,您应该取回另一个操作数。但是,当我检查该功能时,它不是那样工作的。

我在明文中读取它并与之前的密文进行异或

//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]);
}
}

总结我的问题/疑问:我想知道是否有一些我不知道需要做的异或字符。看起来我正在以正确的方式进行操作,但由于某种原因我没有得到正确的结果。我还想知道这是否可能是我阅读信息的方式弄乱了我的程序。请帮帮我!谢谢!

最佳答案

跳出我的错误是在这一行:

  status = write (fdsk, ciphertext, strlen (ciphertext)); // bug here

我很确定你真的想要:

  status = write (fdsk, ciphertext, AES_BLOCK);

两个版本在很多时候可能会产生相同的结果,但有时密码会在密文中间某处产生字节“\0”,然后第一个有缺陷的版本会将写入截断为比您想要的更短的内容。(同样的问题出现在XORing "Hello World!" cuts off string)。

我从异或运算中得到全 0

只有当异或运算的左右两边的值完全相同时才会发生这种情况。您是否可能不小心将数据复制到错误的缓冲区,或者过早地复制数据以备后用,最终导致左右两边的数据副本重复?

关于c - 在 C 中异或问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651823/

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