【问题标题】:Working reference implementation of TwoFish?TwoFish 的工作参考实现?
【发布时间】:2012-01-17 01:44:54
【问题描述】:

wikipedia page on TwoFish 指向这个reference implementation in C(和code),这很好,但它缺少main,而且我在实施的前几次通过没有正确处理任何“已知向量”我尝试过的测试用例。我怀疑我正在查看未正确使用 API 的问题,但我不知道从哪里开始查找错误。我宁愿从一个代码库开始:

  1. 开箱即用
  2. 有测试
  3. 独立
  4. 为了清晰而写

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


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

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

【问题讨论】:

    标签: c encryption reference-implementation twofish


    【解决方案1】:

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

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

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

    文件中有各种可配置的东西;您可能想要更改的是 abort 函数 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。我还没有尝试过,所以我无法评论它是多么容易集成。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是否偶然有源的在线副本?此外,任何使用read()write() 的东西都不是独立的。 OTOH,如果我找不到更好的东西,我希望我可以削减它。
      • 您可以在此处找到源 tarball:packages.ubuntu.com/precise/cryptcat -- 查看页面中间附近的右侧列。我不知道任何地方是否有易于浏览的来源。
      • 下次我在使用 tar 的系统上时会看看 tarball:/
      • 我好像记得 Winzip 可以撤消 tar 文件。
      • [OT] 为什么假设 windows?为什么不是 iOS、Android 或 ChromeOS? :o)
      【解决方案3】:

      如果您只花了一分钟时间阅读 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 实现之外。

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

      【讨论】:

      • 查看该代码,它对我没有任何好处:它没有实际值(或者,据我所知,主函数)。碰巧的是,问题是我未能正确考虑字节顺序。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-22
        • 2012-07-09
        • 2014-08-25
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        相关资源
        最近更新 更多