c - 我的 Blowfish 算法是 "standard"吗?

标签 c encryption cryptography endianness blowfish

我用 C 编写了一个程序的实现,我可以在其中加密文本文件,反之亦然。

BLOWFISH 算法是提供的标准算法。 但后来我的想法是:如果我在一个长文件中创建一组 4 个字符,比如说 0x12345678,我可以解码它,因为我知道读取文件的正确顺序。

另一方面,使用像 memcpy() 这样的预制函数,读取的内容按 0x87654321 排序,而不是像我以前的函数那样。但是使用的算法是一样的。

是否有从文件中读取和获取数据的“标准”方法,或者前面的两个示例都可以?在在线站点 (blowfish online) 中,使用 ECB 模式时,与 memcpy() 一起使用的版本不符合该要求。获取 0x1234567 等数据的版本在该站点上运行良好。 (工作意味着用我的程序制作一个加密文件并在线解密)。

例如,如果我用我的程序编码和解码东西,那些东西应该(知道 key )由不了解我的程序的其他人编码/解码(一般规则,至少)?

编辑:memcpy() 函数将数组的最低索引转换为 INT 数字的右端。

这是操作 64 位 block 数据的代码:

memcpy(&cl, &file_cache[i], sizeof(unsigned long)); 
memcpy(&cr, &file_cache[i + 4], sizeof(unsigned long));

这是使用按位魔术而不是 memcpy() 并遵守字节顺序问题的同一部分的核心部分(通过正确地重新排列缓冲区的读取,即每个 block 循环 8 次,工作正常) :

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进行加密。如果我在线使用其他 blowfish 版本,最后一个实现可以工作,所以原则上应该更好。

哪个实现更快/更好/更轻/更强? 如果建议使用 memcpy(),是否有一种方便快捷的方法来反转/镜像 cl 和 cr 的内容?

最佳答案

请注意,最左边的字节通常是密码学的“第一个字节发送/接收”;即如果你有一个数组,那么最低的索引在左边。如果未指定任何内容,则这是临时标准。

然而,Blowfish test vectors - 如 GregS 所示 - 明确指定此默认顺序,因此无需猜测:

...
All data is shown as a hex string with 012345 loading as
data[0]=0x01;
data[1]=0x23;
data[2]=0x45;
...

只要您的代码生成相同的测试 vector 就没问题,请记住您的输入/输出应符合测试 vector 的顺序。

强烈建议让任何加密 API 对字节(或者更确切地说,八位字节)进行操作,而不是对其他数据类型进行操作,即使这些字节在内部被处理为 32 或 64 位字。与实际的加密/解密相比,转换为字节/从字节转换所需的时间应该最少。

关于c - 我的 Blowfish 算法是 "standard"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587778/

相关文章:

Java:写入和读取基于密码的加密私钥

java - AS3Crypto 和 Javax.Crypto 之间的加密/解密 ECB/PKS5/Blowfish 失败并出现填充错误

python - 我从 clojure 和 python 中得到了稍微不同的 hmac 签名

c# - 如何在 db c# 中存储 X509Certificate2

security - 使用 Rfc2898DeriveBytes 从明文密码创建安全密码时盐的重要性

c - ESP8266无法连接到客户端

c - C中顺序分配内存

encryption - 通过未加密的连接发送密码

c - scanf() 将换行符保留在缓冲区中

更改数组中变量的值(C 编程)