source: trunk/CrypPlugins/Twofish/Twofish.cs @ 223

Last change on this file since 223 was 223, checked in by Thomas Schmid, 13 years ago
  • new setup: added towfish
  • twofish: some image and description cleanup
File size: 10.9 KB
Line 
1//////////////////////////////////////////////////////////////////////////////////////////////////
2// CrypTool V2
3// © 2008 - Gerhard Junker
4// Apache License see http://www.apache.org/licenses/
5//
6// $HeadURL: https://www.cryptool.org/svn/CrypTool2/trunk/SSCext/TwofishBase.cs $
7//////////////////////////////////////////////////////////////////////////////////////////////////
8// $Revision:: 157                                                                            $://
9// $Author:: junker                                                                           $://
10// $Date:: 2008-12-17 08:07:48 +0100 (Mi, 17 Dez 2008)                                        $://
11//////////////////////////////////////////////////////////////////////////////////////////////////
12
13// more about at http://www.schneier.com/twofish.html
14
15using System;
16using System.Collections.Generic;
17using System.Text;
18using Cryptool.PluginBase;
19using Cryptool.PluginBase.Cryptography;
20using Cryptool.PluginBase.IO;
21using Cryptool.PluginBase.Miscellaneous;
22using System.ComponentModel;
23using System.Security.Cryptography;
24
25namespace Twofish
26{
27  [Author("Gerhard Junker", null, "private project member", null)]
28  [PluginInfo(false, "Twofish", "Twofish -- cipher",
29    "Twofish/DetailedDescription/Description.xaml", "Twofish/Images/Twofish.png", "Twofish/Images/encrypt.png", "Twofish/Images/decrypt.png")]
30  [EncryptionType(EncryptionType.SymmetricBlock)]
31  public class Twofish : IEncryption
32  {
33
34    /// <summary>
35    /// Initializes a new instance of the <see cref="Twofish"/> class.
36    /// </summary>
37    public Twofish()
38    {
39      settings = new TwofishSettings();
40    }
41
42    #region IPlugin Member
43
44
45#pragma warning disable 67
46    public event StatusChangedEventHandler  OnPluginStatusChanged;
47    public event GuiLogNotificationEventHandler  OnGuiLogNotificationOccured;
48    public event PluginProgressChangedEventHandler  OnPluginProgressChanged;
49#pragma warning restore
50
51
52    TwofishSettings settings;
53    /// <summary>
54    /// Gets or sets the settings.
55    /// </summary>
56    /// <value>The settings.</value>
57    public ISettings Settings
58    {
59      get
60      {
61        return settings;
62      }
63      set
64      {
65        settings = (TwofishSettings)value;
66        OnPropertyChanged("Settings");
67      }
68    }
69
70    /// <summary>
71    /// Provide all presentation stuff in this user control, it will be opened in an tab.
72    /// Return null if your plugin has no presentation.
73    /// </summary>
74    /// <value>The presentation.</value>
75    public System.Windows.Controls.UserControl Presentation
76    {
77      get
78      {
79        return null;
80      }
81    }
82
83    public System.Windows.Controls.UserControl QuickWatchPresentation
84    {
85      get
86      {
87        return null;
88      }
89    }
90
91    public void PreExecution()
92    {
93    }
94
95    public void Execute()
96    {
97      Crypt();
98    }
99
100    public void PostExecution()
101    {
102    }
103
104    public void Pause()
105    {
106    }
107
108    public void Stop()
109    {
110    }
111
112    public void Initialize()
113    {
114    }
115
116    /// <summary>
117    /// Will be called from editor when element is deleted from worksapce.
118    /// Releases unmanaged and - optionally - managed resources
119    /// </summary>
120    public void Dispose()
121    {
122      foreach (CryptoolStream stream in listCryptoolStreamsOut)
123      {
124        stream.Close();
125      }
126      listCryptoolStreamsOut.Clear();
127    }
128
129    #endregion
130
131
132    #region Input inputdata
133
134    // Input inputdata
135                private byte[] inputdata = { };
136
137                /// <summary>
138                /// Notifies the update input.
139                /// </summary>
140                private void NotifyUpdateInput()
141                {
142                        OnPropertyChanged("InputStream");
143                        OnPropertyChanged("InputData");
144                }
145
146                /// <summary>
147                /// Gets or sets the input inputdata.
148                /// </summary>
149                /// <value>The input inputdata.</value>
150                [PropertyInfo(Direction.Input, "Input Data Stream", "Input data stream to process", "",
151      false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
152                public CryptoolStream InputStream
153                {
154                        get
155                        {
156                                CryptoolStream inputStream = new CryptoolStream();
157                                inputStream.OpenRead(this.GetPluginInfoAttribute().Caption, inputdata);
158                                return inputStream;
159                        }
160                        set
161                        {
162        if (null == value)
163        {
164          inputdata = new byte[0];
165          return;
166        }
167
168                                long len = value.Length;
169                                inputdata = new byte[len];
170
171                                for (long i = 0; i < len; i++)
172                                        inputdata[i] = (byte)value.ReadByte();
173
174                                NotifyUpdateInput();
175                        }
176                }
177
178                /// <summary>
179                /// Gets the input data.
180                /// </summary>
181                /// <value>The input data.</value>
182                [PropertyInfo(Direction.Input, "Input Data", "Input Data to process", "",
183      false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
184                public byte[] InputData
185                {
186                        get
187                        {
188                                return inputdata;
189                        }
190                        set
191                        {
192        if (null == value)
193        {
194          inputdata = new byte[0];
195          return;
196        }
197                                long len = value.Length;
198                                inputdata = new byte[len];
199
200                                for (long i = 0; i < len; i++)
201                                        inputdata[i] = value[i];
202
203                                NotifyUpdateInput();
204                        }
205                }
206                #endregion
207
208    #region Key data
209
210    // Salt Data
211    private byte[] key = { };
212
213    /// <summary>
214    /// Notifies the update key.
215    /// </summary>
216    private void NotifyUpdateKey()
217    {
218      OnPropertyChanged("KeyStream");
219      OnPropertyChanged("KeyData");
220    }
221
222    /// <summary>
223    /// Gets or sets the key data.
224    /// </summary>
225    /// <value>The key data.</value>
226    [PropertyInfo(Direction.Input, "Key Stream", "Key - Input key data",
227      "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
228    public CryptoolStream KeyStream
229    {
230      get
231      {
232        CryptoolStream keyDataStream = new CryptoolStream();
233        keyDataStream.OpenRead(this.GetPluginInfoAttribute().Caption, key);
234        return keyDataStream;
235      }
236      set
237      {
238        if (null == value)
239          return;
240
241        long len = value.Length;
242        key = new byte[len];
243
244        for (long i = 0; i < len; i++)
245          key[i] = (byte)value.ReadByte();
246
247        NotifyUpdateKey();
248        GuiLogMessage("KeyStream changed.", NotificationLevel.Debug);
249      }
250    }
251
252    /// <summary>
253    /// Gets or sets the key data.
254    /// </summary>
255    /// <value>The key data.</value>
256    [PropertyInfo(Direction.Input, "Key Data", "Key - Input key data",
257      "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
258    public byte[] KeyData
259    {
260      get
261      {
262        return key;
263      }
264
265      set
266      {
267        long len = value.Length;
268        key = new byte[len];
269
270        for (long i = 0; i < len; i++)
271          key[i] = value[i];
272
273        NotifyUpdateKey();
274        GuiLogMessage("KeyData changed.", NotificationLevel.Debug);
275      }
276    }
277    #endregion
278
279
280    #region Output
281
282    // Output
283    private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
284    private byte[] outputData = { };
285
286    /// <summary>
287    /// Notifies the update output.
288    /// </summary>
289    private void NotifyUpdateOutput()
290    {
291      OnPropertyChanged("OutputStream");
292      OnPropertyChanged("OutputData");
293    }
294
295
296    /// <summary>
297    /// Gets or sets the output inputdata stream.
298    /// </summary>
299    /// <value>The output inputdata stream.</value>
300    [PropertyInfo(Direction.Output, "Output Stream", "Output stream", "",
301      true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null) ]
302    public CryptoolStream OutputStream
303    {
304      get
305      {
306        CryptoolStream outputDataStream = null;
307        if (outputData != null)
308        {
309          outputDataStream = new CryptoolStream();
310          outputDataStream.OpenRead(this.GetPluginInfoAttribute().Caption, outputData);
311          listCryptoolStreamsOut.Add(outputDataStream);
312        }
313        return outputDataStream;
314      }
315    }
316
317    /// <summary>
318    /// Gets the output inputdata.
319    /// </summary>
320    /// <value>The output inputdata.</value>
321    [PropertyInfo(Direction.Output, "Output Data", "Output data", "",
322      true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
323    public byte[] OutputData
324    {
325      get
326      {
327        return this.outputData;
328      }
329    }
330
331    #endregion
332
333
334
335    #region INotifyPropertyChanged Member
336
337    public event PropertyChangedEventHandler  PropertyChanged;
338    /// <summary>
339    /// Called when [property changed].
340    /// </summary>
341    /// <param name="name">The name.</param>
342    protected void OnPropertyChanged(string name)
343    {
344      if (PropertyChanged != null)
345      {
346        if (name == "Settings")
347        {
348          Crypt();
349        }
350        else
351          PropertyChanged(this, new PropertyChangedEventArgs(name));
352      }
353    }
354
355
356    /// <summary>
357    /// GUIs the log message.
358    /// </summary>
359    /// <param name="message">The message.</param>
360    /// <param name="logLevel">The log level.</param>
361    private void GuiLogMessage(string message, NotificationLevel logLevel)
362    {
363      EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this,
364        new GuiLogEventArgs(message, this, logLevel));
365    }
366
367    #endregion
368
369
370    private void Crypt()
371    {
372      byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
373
374      // fit key to correct length
375      byte[] k2 = new byte[settings.KeyLength / 8];
376      for (int i = 0; i < settings.KeyLength / 8; i++)
377        if (i < key.Length)
378          k2[i] = key[i];
379        else
380          k2[i] = 0;
381   
382
383      TwofishManaged tf = TwofishManaged.Create();
384
385      tf.Mode = (settings.Mode == 0) ? CipherMode.CBC : CipherMode.ECB;
386     
387      int pos = 0;
388      if (outputData.Length != inputdata.Length) 
389        outputData = new byte[inputdata.Length];
390
391      switch (settings.Action)
392      {
393        case 0: // encrypt
394          {
395            ICryptoTransform encrypt =  tf.CreateEncryptor(k2, iv);
396
397            while (inputdata.Length - pos > encrypt.InputBlockSize)
398            {
399              pos += encrypt.TransformBlock(inputdata, pos, encrypt.InputBlockSize, outputData, pos);
400            }
401            byte[] final = encrypt.TransformFinalBlock(inputdata, pos, inputdata.Length - pos);
402            final.CopyTo(outputData, pos);
403            encrypt.Dispose();
404            break;
405          }
406        case 1: // decrypt
407          {
408            ICryptoTransform decrypt =  tf.CreateDecryptor(k2, iv);
409
410            while (inputdata.Length - pos > decrypt.InputBlockSize)
411            {
412              pos += decrypt.TransformBlock(inputdata, pos, decrypt.InputBlockSize, outputData, pos);
413            }
414            byte[] final = decrypt.TransformFinalBlock(inputdata, pos, inputdata.Length);
415            final.CopyTo(outputData, pos);
416            decrypt.Dispose();
417            break;
418          }
419      }
420
421      NotifyUpdateOutput();
422    }
423
424  }
425}
Note: See TracBrowser for help on using the repository browser.