1

TwoFish 上的维基百科页面指出了这个用 C 语言(和代码)实现的参考实现,这很好,但是它缺少一个main,而且我在实现一个时的前几次通过并没有正确处理我尝试的任何“已知向量”测试用例。我怀疑我正在查看未正确使用 API 的问题,但我不知道从哪里开始查找错误。我宁愿从一个代码库开始,而不是在那个上面打我的头:

  1. 开箱即用
  2. 有测试
  3. 自包含的
  4. 清楚起见而写

我也非常喜欢 C 或 C 之类的 C++ 代码。


注意:在这一点上,我对代码的可读性比其他任何事情都更感兴趣。可以加密和解密单个块的小而简单的代码和硬编码一个或三个调用的主要功能将是理想的。除此之外的大多数东西(如任何用户界面)对于我的用例来说都只是噪音。

此外,任何拥有比 Boost 更严格的许可证的东西对我来说只有作为了解良好价值和比较状态的来源才有用。

4

4 回答 4

2

我采用了 Twofish 的设计者之一 Neils Ferguson 的实现,并用 C++ 封装了它(非常轻松,只做很少的改动),它运行良好。我必须强烈强调我在这里几乎没有做过任何工作,也没有声称了解 Twofish 是如何工作的(这是在阅读之后 - 但我很难理解)。

构造函数进行全面测试,如果测试失败则中止,所以一旦你有一个完全构造的对象,你就知道它会工作。

我把来源放在这里:https ://www.cartotype.com/assets/downloads/twofish/ 。

文件中有各种可配置的东西;您可能想要更改的是中止函数 Twofish_fatal,在我的版本中,它尝试写入地址 0 以强制退出,但这在某些平台上不起作用。

就像上面提到的代码一样,所有这些都是对单个 16 字节块进行编码(ECB = 电子密码本模式)。但是在它之上实现更好的模式非常容易,例如密码块链接,其中每个纯文本块在加密之前与前一个密文块进行异或(使用 16 字节的随机“初始化向量”作为第一个块,并将其与加密数据一起传输)。

另一个实现可以在 Bruce Schneier 的开源密码数据库程序 PasswordSafe 的源代码中找到:相关来源在这里:http ://passwordsafe.git.sourceforge.net/git/gitweb.cgi?p=passwordsafe/pwsafe .git;a=tree;f=pwsafe/pwsafe/src/core;hb=HEAD。我还没有尝试过,所以我无法评论它是多么容易集成。

于 2012-08-29T21:40:12.543 回答
0

UbuntuDebiancryptcat上的软件包提供了类似的功能,内置了 twofish。nc(1)

源代码包中twofish2.cc提供了 twofish 支持。在 C 风格和功能与 twofish 算法之间提供了一个层——它的风格我称之为 C-like C++。twofish2.hfarm9crypt.ccread()write()

于 2012-01-17T02:03:47.013 回答
0

如果您花一点时间阅读libObfuscate提供的参考实现, 您会发现使用 TwoFish 的剪切粘贴示例。

// Encrypt : outBuf [16] = Twofish ECB ( inBuf [16] )
TWOFISH_STATIC_DATA twofish; 
BYTE passw [32]; 
BYTE inBuf [16] , outBuf [16]; 

memset( &twofish , 0 , sizeof( TWOFISH_STATIC_DATA ) ); 
Twofish_set_key( &twofish.key , ( DWORD * ) passw , 256 );
Twofish_encrypt( &twofish.key , ( DWORD * ) inBuf , ( DWORD * ) outBuf );   

除了单一区块的 ECB 实施之外,没有任何严肃的参考实施。

如果您希望加密更多数据,您需要选择密码块链接模式(CBC、ecc...)并将其应用于 ECB 之上。

于 2012-02-10T18:24:56.110 回答
-1

我最终发现这个 Python 实现源自我上面列出的 C 实现。我的问题的根本原因原来是键的单词顺序错误。

于 2012-01-19T19:32:11.743 回答