【发布时间】:2017-12-29 16:38:29
【问题描述】:
我有一个对 DES 进行编码的课程项目,但在从输入文件中获取 64 位块时遇到问题。
在加密阶段一切正常,但是当我开始解密时,在将文件读入缓冲区后,我的 CharArrayToInt64() 函数将输入缓冲区的大部分替换为 F。
这是我的功能:
void charArrayToInt64(uint64_t *bufferText, char *buffer, long length){
for(size_t i = 0; i < length/8 + 1; i++){
bufferText[i] = 0x0;
bufferText[i] = ((uint64_t)buffer[i*8]<<56)
| ((uint64_t)buffer[i*8 + 1]<<48)
| ((uint64_t)buffer[i*8 + 2]<<40)
| ((uint64_t)buffer[i*8 + 3]<<32)
| ((uint64_t)buffer[i*8 + 4]<<24)
| ((uint64_t)buffer[i*8 + 5]<<16)
| ((uint64_t)buffer[i*8 + 6]<<8)
| ((uint64_t)buffer[i*8 + 7]);
}
}
这是缓冲区的输出,也是加密阶段uint64_t的数组:
Buffer: uint64_t array:
5468 6973 2069 7320 5468 6973 2069 7320
6120 7465 7874 2066 6120 7465 7874 2066
696c 6520 7772 6974 696c 6520 7772 6974
7465 6e20 666f 7220 7465 6e20 666f 7220
7465 7374 2070 7572 7465 7374 2070 7572
706f 7365 732e 2049 706f 7365 732e 2049
6620 4445 5320 776f 6620 4445 5320 776f
726b 7320 636f 7272 726b 7320 636f 7272
6563 746c 792c 2061 6563 746c 792c 2061
6e64 2074 6865 2066 6e64 2074 6865 2066
696c 6520 6973 2072 696c 6520 6973 2072
6561 6420 616e 6420 6561 6420 616e 6420
7370 6c69 7420 7072 7370 6c69 7420 7072
6f70 6572 6c79 2c20 6f70 6572 6c79 2c20
7468 6973 2074 6578 7468 6973 2074 6578
7420 7368 6f75 6c64 7420 7368 6f75 6c64
2072 6574 7572 6e20 2072 6574 7572 6e20
7265 6164 6162 6c65 7265 6164 6162 6c65
2efc ffff ffff fd7f 0000
以下是解密阶段缓冲区和 uint64_t 数组的输出(注意它们与上面的不匹配,因为我使用的是之前的加密文本):
Buffer: uint64_t array:
e824 8aa4 db58 5b12 ffff ffff db58 5b12
b8d2 2b8f 980c 915f ffff ffff ffff 915f
f942 a226 9c69 bcc4 ffff ffff ffff ffc4
c660 bd78 179d b628 ffff ffff ffff b628
1ed1 d846 ceb1 f8b5 ffff ffff ffff ffb5
2e67 fa25 66bd 0f13 ffff ffff ffbd 0f13
d11d 1203 d10f dc9e ffff ffff ffff ff9e
6124 0cf1 9393 3816 ffff ffff ff93 3816
efab b9ad fb20 23c0 ffff ffff ffff ffc0
6a2a 20c1 a610 1422 ffff ffff a610 1422
119d d9c5 9de1 0f08 ffff ffff ffe1 0f08
331e d4e7 2214 bdb1 ffff ffff ffff ffb1
c408 74e2 6e14 84e6 ffff ffff ffff ffe6
3fe6 5eca 04c5 70c6 ffff ffff ffff ffc6
12f8 bcaa 1df7 342d ffff ffff fff7 342d
93eb 15d8 eb8d b51e ffff ffff ffff b51e
7fd2 a2d7 b357 a6eb ffff ffff ffff ffeb
7fb9 bf2b 0ebe bb99 ffff ffff ffff ff99
3300 3300 0000 0000 0000
如您所见,在加密阶段,我的函数只弄乱了最后一行,而在解密阶段,完全相同的函数弄乱了最后一行...
任何帮助都将不胜感激,因为过去几个小时我一直在试图解决这个问题,但无济于事。
如果您需要/想要任何额外的信息,我会尽力提供。
EDIT-1:在@coderredoc、@chux 和@Myst 的帮助下,我的问题基本上得到了解决,而且代码也更加简洁! (以前的函数charArrayToInt64() 不再使用)
还有一个问题:如果bufferText 中的最后一个 64 位块没有被fread() 完全填充,我最终会得到我似乎无法摆脱的尾随位(即使我设置了完整的块在填充之前为 0)。这会导致解密阶段出现问题:
原始输入文件:
这是一个为测试目的而编写的文本文件。如果 DES 工作正常,并且文件被正确读取和拆分,则此文本应返回可读且没有错误。
带有尾随“随机”位的解密输出:
这是一个为测试目的而编写的文本文件。如果 DES 正常工作,并且文件被正确读取和拆分,则此文本应返回可读且没有错误ÒÕäTR†
我试过了:
memset(bufferText, 0, length + 8);(以及最后一个参数的变化)
bufferText[length/8] = bufferText[length/8]<<((length%8)*8);(以及之后将它们移回原始位置)
EDIT-2
以前的编辑已过时,原来我跳过了要求我一次读取一个字节的作业的一部分,而这又需要使用fgetc() 和fputc() 进行读写。所有答案仍然非常有帮助,而且非常重要,非常感谢!
【问题讨论】:
-
为什么最后几行不完整?你能提供完整的线路吗?
-
bufferText和buffer有多大,buffer中希望未使用的部分如何初始化? -
@coderredoc 如果你在谈论缓冲区中的最后几行,它们并不完整,其余都是 0 的 @alk
bufferText和buffer分别是length/8 + 1和 @987654337 @long withlength = ftell(ptrR)(在执行fseek(ptrR, 0, SEEK_END)之后) -
sry 对于双重帖子,我的电脑拒绝让我再次编辑以前的评论以获得更高的精度:@alk 考虑到
buffer是按照给定文件所需的确切大小创建的,那里不应该是未使用的部分,另一方面,bufferText确实有未使用的部分,但由于它们都是可变长度的,具体取决于文件大小,我没有专门初始化 bufferText(fread(buffer, length, 1, ptrR);是缓冲区的唯一定义) -
首先我们说的是从
Buffer到uint64_t数组的第二次转换。不是吗?buffer包含左列数据,buFFertext将包含形成的数组。并在每个位置e8、24等每个字节上缓冲 conatins。澄清这一点。确认我是否正确。
标签: c arrays encryption byte