65.9K
CodeProject 正在变化。 阅读更多。
Home

Twofish 密码的 C# 实现

2002年7月18日

CPOL

3分钟阅读

viewsIcon

183990

downloadIcon

2276

一篇关于将Twofish密码的C#实现集成到.NET框架中的文章。

前言

本文是关于使用.NET框架创建一个加密提供程序,并使用.NET平台提供的相同机制来集成它。本文不是关于Twofish密码本身的,而是用作一个可以以这种方式集成的密码示例。

引言

.NET框架支持各种加密提供程序,例如AES的获胜者Rijndael。 但是,可以使用相同的框架来添加自定义加密提供程序,并以与.NET提供的提供程序相同的方式使用它们。 不仅需要将其用于加密,因为相同的框架也可以用于任何形式的编码机制,例如压缩或MIME编码。 此外,这些转换可以通过流连接在一起,因此可以以非常简单的方式级联这些转换,即memory -> compress -> encrypt -> encode。 使用过Crypto++的人员将熟悉此技术。 为此,.NET框架提供了基类SymmetricAlgorithm和一个接口ICryptoTransform

调查

为了研究.NET框架如何使用SymmetricAlgorithm类和ICryptoTransform接口,我创建了一个简单的类XOR,该类在数据块上执行逐字节的eXclusiveOR。 一个非常基本且非常糟糕的加密系统,但至少可以让人们确定我们是否正确使用了提供的类和接口。 我也将其包含在安装中,但它只是一堆方法/属性和大量的跟踪语句。

发现

byte[] ICryptoTransform.TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount); - 当您返回null时,此方法不喜欢,并且在没有数据要返回时会引发异常。 通常在调用此方法但inputCount为0时会出现这种情况,您必须返回new byte[0]。 这尚未在帮助文件中记录。

public virtual SymmetricAlgorithm.CipherMode Mode {get; set;} - 框架本身不使用此属性来实现各种密码模式 - 您必须在转换数据时读取此属性并采取相应的措施。

Twofish

现在掌握了新发现的知识,我继续用C#实现Twofish密码。 我的实现基于Twofish密码的参考C实现,该实现可以在Counterpane Internet Security找到,因为我认为优化的C实现无法很好地移植。 我已经测试了代码,使其在EBC模式下工作,并且我也实现了CBC模式。

级联

正如我之前提到的,可以级联这些转换,这样只需一次调用即可进行压缩 -> 加密 -> 编码。 在安装中,我已经展示了如何级联Twofish密码和.NET提供的Base64转换FromBase64TransformToBase64Transform。 我还没有展示压缩步骤,因为我尚未实现该转换。

Twofish fish = new Twofish();
System.IO.MemoryStream ms = new System.IO.MemoryStream();

// create an encoder
ICryptoTransform encode = new ToBase64Transform();

//create Twofish Encryptor from this instance
ICryptoTransform encrypt = fish.CreateEncryptor( Key, IV);
// both Key and IV are byte[] types 

// we have to work backwards defining the last link in the chain first
CryptoStream cryptostreamEncode = new CryptoStream( ms, encode, 
                                                    CryptoStreamMode.Write);
CryptoStream cryptostream = new CryptoStream( cryptostreamEncode, encrypt, 
                                              CryptoStreamMode.Write);
// or we could do this as we don't need to use cryptostreamEncode
CryptoStream cryptostream = new 
  CryptoStream(new CryptoStream( ms,encode, CryptoStreamMode.Write), 
  encrypt, CryptoStreamMode.Write);

待解决的问题

  • 我没有创建任何通常在GenerateIV()GenerateKey()重写中实现的随机密钥或IV机制。
  • 需要进一步测试以测试CBC模式并添加其他密码模式。
  • 将压缩算法集成到支持ICryptoTransform接口的类中
  • 优化代码。 正如我之前提到的,我不太确定如何优化C#代码,因此非常感谢任何提示。
  • 由于编译,卸载程序不会删除任何生成的文件。

历史

第一个版本 - 2002年7月17日

© . All rights reserved.