【问题标题】:Blowfish encryption algorithm explained河豚加密算法解释
【发布时间】:2014-04-30 22:47:06
【问题描述】:

我很难实现blowfish encryption algorythm

谁能给我解释一下, 如果这是发生加密的函数:

 void encrypt (uint32_t & L, uint32_t & R) {
    for (int i=0 ; i<16 ; i += 2) {
       L ^= P[i];
       R ^= f(L);
       R ^= P[i+1];
       L ^= f(R);
    }
    L ^= P[16];
    R ^= P[17];
    swap (L, R);
 }

那么这样的函数会是什么样子:

/**
*
* @param string text this is the text to be encrypted
* @return string this is encrypted text 
*/
string EncryptBlowfish(string text){
    //something happens here
}

【问题讨论】:

  • Blowfish 可能是最容易理解且最优雅的加密方式。
  • 如果您阅读您提供的链接的key_schedule 函数,您会看到加密发生的位置。 encrypt 函数对块中的 2 个连续单词进行操作。
  • 开箱即用的代码很难理解,而且我没有找到任何可以流畅阅读的示例。你有任何@ZacHowland
  • @user3325976 我建议您投资Applied Cryptography 以开始使用。

标签: c++ encryption encryption-symmetric blowfish


【解决方案1】:

通常,您应该查看现有的加密库接口和 Blowfish 的理论描述,以更好地了解这些实现以前是如何完成的,包括接口的设计。要设计一个好的界面,您需要为您的代码提供大量的用例,并且在没有该数据示例的情况下,您的案例是独一无二的,您应该回归已经普遍的智慧。

例如,查看 crypto++ 页面以了解河豚(并向下滚动到页面末尾以跳过流和过滤器,其中显示了可以馈送单个字节的加密器的使用情况)。

继续这个例子,您的代码可以如下所示:

class StatefulBlowfish {    
private:
   BlowfishKey key_;
   BlowfishIv iv_;
public:    
void EncryptCBC(string text, /*out*/ byte*){
   for (int i=0; I < text.size(); i++) {
      // process and xor an individual ‘(byte)text[i]’ the 
      // necessary number of rounds. Consider padding.
  }
  ...    
}

但是这样的类不是很通用,并且有很多固定的部分,这会使测试、使用和维护变得更加困难。要考虑的另一件重要事情是,您必须设计的接口不限于使用字符串进行加密,正如您在问题中所建议的那样,而是必须考虑链接模式、密钥和 iv——它们是最好在别处创建和管理,坚持单一职责原则。

您还应该努力将数组或指向字节数组的指针作为低级加密器方法的接口,因为这是算法的运行方式,理想情况下是从字符串到字节数组的序列化(反之亦然)反之亦然)应卸载到单独的接口。 (例如,考虑对大端和小端架构之间的“字符串”的假设,或者对填充的要求。)

一个好的通用 OOP 设计一方面是加密“部分”的集合,每个部分或多或少都有一个单一的职责(序列化、填充、链接模式、密钥初始化、密钥调度等),另一方面是一个好的设计允许轻松创建更大的责任链结构,通过简单地观察代码来描述意图。

回到cryptopp,修改一个标准代码示例以获得更好的清晰度,看看如何分别处理所有内容:

// a key is created, to be separately initialised with a PRNG
// or from a secure source, hardware TRNG, etc.
SecByteBlock key(Blowfish::DEFAULT_KEYLENGTH); 
...
// an iv is created, similarly to be separately initialised with a PRNG
byte iv[Blowfish::BLOCKSIZE]; 
...
// Wrap blowfish low-level implementation in a CBC chaining mode 
// and initialise it with the key and iv    
CBC_Mode<Blowfish>::Encryption e; 
e.SetKeyWithIV(key, key.size(), iv);    
...    
// have a separate padding wrapper
... new StreamTransformationFilter(e, /*out*/ cipher)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2013-07-05
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多