Ignore:
Timestamp:
Dec 18, 2008, 9:09:12 AM (13 years ago)
Author:
Gerhard Junker
Message:

Twofish Plugin Beta

Location:
trunk/CrypPlugins/Twofish
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/Twofish/Twofish.cs

    r159 r160  
    2020using Cryptool.PluginBase.IO;
    2121using Cryptool.PluginBase.Miscellaneous;
    22 using System.Collections;
    23 using System.IO;
    2422using System.ComponentModel;
    25 
     23using System.Security.Cryptography;
    2624
    2725namespace Twofish
     
    3432  {
    3533
     34    /// <summary>
     35    /// Initializes a new instance of the <see cref="Twofish"/> class.
     36    /// </summary>
    3637    public Twofish()
    3738    {
    3839      settings = new TwofishSettings();
    39 
    40       ASCIIEncoding enc = new ASCIIEncoding();
    41       outputData = enc.GetBytes("NOT yet implemented.");
    4240    }
    4341
     
    9795    public void Execute()
    9896    {
    99       GuiLogMessage("NOT yet complete implemented.", NotificationLevel.Warning);
     97      Crypt();
    10098    }
    10199
     
    131129    #endregion
    132130
    133     private void Crypt()
    134     {
    135       GuiLogMessage("NOT yet implemented.", NotificationLevel.Warning);
    136 
    137 
    138       NotifyUpdateOutput();
    139     }
    140131
    141132    #region Input inputdata
     
    215206                #endregion
    216207
     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
    217280    #region Output
    218281
     
    236299    /// <value>The output inputdata stream.</value>
    237300    [PropertyInfo(Direction.Output, "Output Stream", "Output stream", "",
    238       true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null) ]
     301      true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null) ]
    239302    public CryptoolStream OutputStream
    240303    {
     
    257320    /// <value>The output inputdata.</value>
    258321    [PropertyInfo(Direction.Output, "Output Data", "Output data", "",
    259       true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     322      true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
    260323    public byte[] OutputData
    261324    {
     
    303366
    304367    #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
    305424  }
    306425}
  • trunk/CrypPlugins/Twofish/TwofishSetting.cs

    r159 r160  
    2727namespace Twofish
    2828{
    29   class TwofishSettings : ISettings
     29  public class TwofishSettings : ISettings
    3030  {
    3131
    3232    private bool hasChanges = false;
     33
     34    static int[] keyTab = { 128, 192, 256};
    3335
    3436    #region ISettings Member
     
    6668      get
    6769      {
    68         return this.action;
     70        return action;
    6971      }
    7072      set
     
    7274        if (((int)value) != action)
    7375          hasChanges = true;
    74         this.action = (int)value;
     76        action = (int)value;
    7577        OnPropertyChanged("Action");
    7678      }
     
    9092      get
    9193      {
    92         return this.mode;
     94        return mode;
    9395      }
    9496
     
    99101        this.mode = (int)value;
    100102        OnPropertyChanged("Mode");
     103      }
     104    }
     105
     106
     107    int keySize = 0;
     108    [ContextMenu("KeySize",
     109      "Select the key size. Note that providing a longer key will result in cutting the overlapping bytes, " +
     110      "providing a shorter key will result in filling up with zeroes.", 3,
     111      DisplayLevel.Beginner, ContextMenuControlType.ComboBox, null, "128 Bits", "192 Bits", "256 Bits")]
     112    [TaskPane("KeySize",
     113      "Select the key size. Note that providing a longer key will result in cutting the overlapping bytes, "+
     114      "providing a shorter key will result in filling up with zeroes.", "", 3, false,
     115      DisplayLevel.Beginner, ControlType.ComboBox, new String[] { "128 Bits", "192 Bits", "256 Bits" })]
     116    public int KeySize
     117    {
     118      get
     119      {
     120        return keySize;
     121      }
     122      set
     123      {
     124        if (((int)value) != keySize)
     125          hasChanges = true;
     126        keySize = (int)value;
     127        OnPropertyChanged("KeySize");
     128      }
     129    }
     130
     131
     132    /// <summary>
     133    /// Gets the length of the key.
     134    /// </summary>
     135    /// <value>The length of the key.</value>
     136    public int KeyLength
     137    {
     138      get
     139      {
     140        return keyTab[keySize];
    101141      }
    102142    }
Note: See TracChangeset for help on using the changeset viewer.