TwoFish 的维基百科页面 指向此 C 语言参考实现 (和 代码)这很好,但它缺少 main 我在实施时的前几次没有正确处理我尝试的任何“已知向量”测试用例。我怀疑我正在寻找未正确使用 API 的问题,但我不知道从哪里开始寻找错误。与其在这个问题上绞尽脑汁,我宁愿从一个代码库开始:

  1. 开箱即用
  2. 有测试
  3. 自给自足
  4. 为清楚起见而写

我也非常偏爱 C 或类似 C++ 的 C 代码。


笔记:此时我对代码的可读性比其他任何事情都更感兴趣。可以加密和解密单个块的小而简单的代码以及对一个或三个调用进行硬编码的主函数将是理想的。除此之外的大多数东西(比如任何用户界面)对于我的用例来说都只是噪音。

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

有帮助吗?

解决方案 4

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

其他提示

我采用了 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. 。我还没有尝试过,所以我无法评论它的集成有多容易。

cryptcat 封装在 乌班图德班 提供一个 nc(1)与内置的 Twofish 类似的功能。

Twofish 支持提供于 twofish2.cctwofish2.h 源码包中。 farm9crypt.cc 在 C 风格之间提供了一层 read()write() 功能和twofish 算法——我称之为类C C++ 的风格。

如果您只花了一分钟来阅读由 lib混淆您会发现使用 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 );   

除了单块欧洲央行的实施,没有其他认真的参考实施。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top