TwoFish的工作参考实现?

时间:2012-01-17 01:44:54

标签: c encryption reference-implementation twofish

wikipedia page on TwoFish(和reference implementation in C)的code点很好,但是它缺少main而且我执行一次的前几次传递没有正确处理我尝试过的任何“已知载体”测试用例。我怀疑我正在考虑不正确使用API​​的问题,但我不知道从哪里开始寻找错误。我宁愿从一个代码库开始,而不是打败那个:

  1. 开箱即用
  2. 有测试
  3. 自包含
  4. 为了清楚起见
  5. 我也非常喜欢C或C,比如C ++代码。


    注意:此时我对代码可读性比其他任何事情都更感兴趣。可以加密和解密单个块的小而简单的代码和硬编码一个或三个呼叫的主要功能将是理想的。除此之外的大多数事情(就像任何用户界面一样)只会对我的用例产生噪音。

    此外,任何拥有比Boost更多限制许可的东西对我来说只对我有用,因为它是知道好的值和要比较的状态的来源。

4 个答案:

答案 0 :(得分:1)

我采用了Twofish的设计师之一Neils Ferguson的实现,并在C ++中包含它(非常轻微,只进行了很少的更改),并且效果很好。我必须强烈强调我在这里几乎没有做过任何工作,也没有声称理解Twofish是如何工作的(那是在阅读之后 - 但这对我来说太难了)。

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

我把来源放在这里:http://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。我没有尝试过,所以我无法评论它的集成有多容易。

答案 1 :(得分:0)

UbuntuDebian上的cryptcat包提供了类似nc(1)的功能,内置了两个。

源代码包中twofish2.cctwofish2.h提供了两个支持。 farm9crypt.cc提供了C风格的read()write()功能以及twofish算法之间的一个层 - 它的风格我称之为C类C ++。

答案 2 :(得分:0)

如果你花了一分钟时间阅读 libObfuscate提供的参考实施 你会找到一个使用TwoFish的cut'n'paste例子。

// 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实现。

如果您希望加密需要选择的更多数据 密码块chaining mode(CBC,ecc ...)并将其应用于欧洲央行之上。

答案 3 :(得分:-1)

我最终发现this Python implementation来自我上面列出的C implamentation。我的问题的根本原因是关键词的顺序错误。