Shaun Wilde">
Click here to Skip to main content
15,350,424 members
Articles / Programming Languages / C#
Posted 17 Jul 2002


45 bookmarked

A C# implementation of the Twofish cipher

Rate me:
Please Sign up or sign in to vote.
3.45/5 (7 votes)
17 Jul 2002CPOL3 min read
An article on integrating a C# implementation of the Twofish cipher into the .NET framework.


This article is about using the .NET framework to create an encryption provider and integrate it using the same mechanism provided by the .NET platform. This article is not about the Twofish cipher itself but is used as an example cipher that can can be integrated in such a manner.


The .NET framework supports various encryption providers such as the AES winner Rijndael. But it is possible to use the same framework to add custom encryption providers and use them in the same manner as the .NET provided ones. It is not necessary to just use it for encryption as the same framework can also be used for any form of encoding mechanism such as compression or MIME encoding. Also these transformations can be connected together via the streams so that it is possible to cascade these transformations i.e. memory -> compress -> encrypt -> encode, in a very simple manner. This technique will be familiar to people who have used Crypto++. For this purpose the .NET framework provides a base class SymmetricAlgorithm and an interface ICryptoTransform.


To investigate how the .NET framework used the SymmetricAlgorithm class and ICryptoTransform interface I created a simple class XOR which does a byte by byte eXclusiveOR on a block of data. A very basic and very poor encryption system but it at least lets one work out if we are using the supplied classes and interfaces correctly. I have also included this in the install but it is just a bunch of methods/properties and lots of trace statements.


byte[] ICryptoTransform.TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount); - This method does not like when you return null, throws an exception, when there is no data to return. You will usually have this case when this method is called but inputCount is 0, instead you have to return new byte[0]. This is not documented in the help files (yet).

public virtual SymmetricAlgorithm.CipherMode Mode {get; set;} - The framework does not use this property itself to implement the various cipher modes - you must read this property when you are transforming data and act accordingly.


Now armed with the new found knowledge I proceeded to implement the Twofish cipher in C#. I based my implementation on the reference C implementation of the Twofish cipher which can be found at Counterpane Internet Security as I do not think the optimised C implementation would port as well. I have tested the code so that it works in EBC mode and I have also implemented CBC mode as well.


As I mentioned before it is possible to cascade these transforms such that with one call you can compress -> encrypt -> encode. In the install I have shown how one may cascade the Twofish cipher and the .NET provided Base64 transforms FromBase64Transform and ToBase64Transform. I haven't shown the compression step as I have yet to implement that transform.

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, 
CryptoStream cryptostream = new CryptoStream( cryptostreamEncode, encrypt, 
// 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);

Outstanding Issues

  • I have not created any random key or IV mechanism that would normally be implemented in the GenerateIV() and GenerateKey() overrides.
  • Need further testing to test the CBC mode and to add other cipher modes.
  • Integrate a compression algorithm into a class that supports ICryptoTransform interface
  • Optimise the code. As I mentioned before I am not too sure how to go about optimising C# code so any tips appreciated.
  • The uninstall does not remove any produced files due to compilation.


First revision - 17 July 2002


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Shaun Wilde
Employed (other) Purplebricks
Australia Australia
All articles are supplied as-is, as a howto on a particular task that worked for me in the past. None of the articles are supposed to be out-of-the-box freeware controls and nor should they be treated as such. Caveat emptor.

Now living and working in Australia, trying to be involved in the local .NET and Agile communities when I can.

I spend a good chunk of my spare time building OpenCover and maintaining PartCover both of which are Code Coverage utilities for .NET.

Comments and Discussions

QuestionSpeed: Later .NET benefits Pin
quig042-Jan-14 19:32
Memberquig042-Jan-14 19:32 
AnswerRe: Speed: Later .NET benefits Pin
Shaun Wilde13-Jan-14 0:33
MemberShaun Wilde13-Jan-14 0:33 
Questionfile size increased after encryption Pin
Alexander Kulygin31-May-13 22:56
MemberAlexander Kulygin31-May-13 22:56 
AnswerRe: file size increased after encryption Pin
Shaun Wilde9-Jun-13 15:01
MemberShaun Wilde9-Jun-13 15:01 
GeneralBug in Mono Pin
Member 194556810-Oct-09 7:37
MemberMember 194556810-Oct-09 7:37 
GeneralRe: Bug in Mono Pin
Shaun Wilde26-Oct-10 10:46
MemberShaun Wilde26-Oct-10 10:46 
GeneralMore or less bug in TransformBlock Pin
Svante Seleborg12-Oct-07 4:21
MemberSvante Seleborg12-Oct-07 4:21 
GeneralRe: More or less bug in TransformBlock Pin
Shaun Wilde12-Oct-07 5:06
MemberShaun Wilde12-Oct-07 5:06 
GeneralRe: More or less bug in TransformBlock Pin
Svante Seleborg12-Oct-07 5:15
MemberSvante Seleborg12-Oct-07 5:15 
GeneralRe: More or less bug in TransformBlock Pin
Shaun Wilde13-Oct-07 2:58
MemberShaun Wilde13-Oct-07 2:58 
GeneralRe: More or less bug in TransformBlock Pin
Svante Seleborg13-Oct-07 9:57
MemberSvante Seleborg13-Oct-07 9:57 
GeneralRe: More or less bug in TransformBlock Pin
Shaun Wilde13-Oct-07 11:35
MemberShaun Wilde13-Oct-07 11:35 
GeneralRe: More or less bug in TransformBlock Pin
Svante Seleborg14-Oct-07 0:53
MemberSvante Seleborg14-Oct-07 0:53 
GeneralNice topic Pin
Vahe Karamian13-Feb-07 14:20
MemberVahe Karamian13-Feb-07 14:20 
GeneralRe: Nice topic Pin
Shaun Wilde17-Feb-07 21:46
MemberShaun Wilde17-Feb-07 21:46 
GeneralI met some problem Pin
pdwolf18-May-03 20:14
Memberpdwolf18-May-03 20:14 
GeneralRe: I met some problem Pin
Shaun Wilde19-May-03 9:09
MemberShaun Wilde19-May-03 9:09 
GeneralRe: I met some problem Pin
find_ananth26-Oct-10 6:48
Memberfind_ananth26-Oct-10 6:48 
GeneralRe: I met some problem Pin
Shaun Wilde26-Oct-10 10:49
MemberShaun Wilde26-Oct-10 10:49 
GeneralQuestion Pin
Fad B26-Mar-03 20:32
MemberFad B26-Mar-03 20:32 
GeneralRe: Question Pin
Shaun Wilde26-Mar-03 21:37
MemberShaun Wilde26-Mar-03 21:37 
GeneralRe: Question Pin
Fad B27-Mar-03 0:19
MemberFad B27-Mar-03 0:19 
GeneralRe: Question Pin
Shaun Wilde27-Mar-03 1:38
MemberShaun Wilde27-Mar-03 1:38 
QuestionRjindael broken? Pin
Shaun Wilde17-Sep-02 4:47
MemberShaun Wilde17-Sep-02 4:47 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.