Twofish 密码的 C# 实现






3.45/5 (7投票s)
一篇关于将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转换FromBase64Transform
和ToBase64Transform
。 我还没有展示压缩步骤,因为我尚未实现该转换。
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日