我在C中编写了一个程序的实现,我可以在其中加密文本文件,反之亦然。
BLOWFISH算法是提供的标准算法。 但后来我的想法是:如果我在长文件中创建一组4个字符,让我们说0x12345678,我可以解码它,因为我知道我读取文件的正确顺序。
另一方面,使用像memcpy()
这样的预制函数,内容读取的顺序与0x87654321类似,而不像我之前的函数那样。但使用的算法是相同的。
是否有"标准"从文件中读取和获取数据的方法,或者前面两个例子都没问题?在在线网站(blowfish online)中,与memcpy()
一起使用的版本在使用ECB模式时不符合该版本。获取数据的版本(如0x1234567)可以正常使用该站点。 (工作意味着使用我的程序制作加密文件并在线解密)。
例如,如果我使用我的程序对代码进行编码和解码,那些的东西应该(知道密钥)由其他不了解我的程序的人编码/解码(作为一般规则,至少)?
编辑:memcpy()
函数将数组的最低索引转换为INT编号的右端。
这是操作64位块数据的代码:
memcpy(&cl, &file_cache[i], sizeof(unsigned long));
memcpy(&cr, &file_cache[i + 4], sizeof(unsigned long));
这是核心部分(工作正常,通过正确地重新排列缓冲区的读数,即每个块循环8次),使用按位魔术代替memcpy()并符合endianess问题:
if (i==0){
cl <<= 24;
L |= 0xff000000 & cl;
}
else if (i==1){
cl <<= 16;
L |= 0x00ff0000 & cl;
}
else if (i==2){
cl <<= 8;
L |= 0x0000ff00 & cl;
}
else if (i==3){
//cl <<= 24;
L |= 0x000000ff & cl;
}
else if (i==4){
cl <<= 24;
R |= 0xff000000 & cl;
}
else if (i==5){
cl <<= 16;
R |= 0x00ff0000 & cl;
}
else if (i==6){
cl <<= 8;
R |= 0x0000ff00 & cl;
}
else if (i==7){
//cl <<= 8;
R |= 0x000000ff & cl;
}
然后发送L和R进行加密。如果我在线使用其他河豚版本,这最后一个实现是有效的,所以原则上应该更好。
哪种实施更快/更好/更轻/更强?
如果建议使用memcpy()
,那么可以方便快捷地反转/镜像cl和cr的内容吗?
答案 0 :(得分:1)
请注意,最左边的字节通常是&#34;第一个字节发送/接收&#34;密码学;即如果你有一个数组,那么最低的索引是在左边。如果没有指定任何内容,则这是临时标准。
然而,正如GregS所示,Blowfish test vectors明确指定了此默认顺序,因此无需猜测:
...
All data is shown as a hex string with 012345 loading as
data[0]=0x01;
data[1]=0x23;
data[2]=0x45;
...
只要您的代码生成相同的测试向量,那么您就可以了,请记住您的输入/输出应符合测试向量的顺序。
强烈建议使任何加密API在字节(或更确切地说是八位字节)上运行,而不是在其他数据类型上运行,即使这些字节在内部处理为32或64位字。与实际加密/解密相比,转换为/从字节转换所需的时间应该是最小的。
答案 1 :(得分:0)
如果您将文件读取为4字节字序列,那么您需要考虑内存布局中这些字的endianness,根据需要交换字节以确保处理单个字节一致的订单。
但是,如果您将文件作为字节序列读/写,并直接按顺序存储在内存中(例如,在unsigned char数组中),则文件中的数据应具有与内存中相同的布局。这样,无论是直接从/向内存编码还是从/到文件编码,都可以获得一致的编码/解码。