Changeset 772


Ignore:
Timestamp:
Oct 23, 2009, 3:30:27 PM (12 years ago)
Author:
kopal
Message:

implemented KeySearching on DES

Location:
trunk
Files:
1 added
1 edited

Legend:

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

    r717 r772  
    1111using System.Windows.Controls;
    1212using Cryptool.PluginBase.Control;
     13using System.Reflection;
    1314
    1415namespace Cryptool.Plugins.Cryptography.Encryption
     
    2728        private CryptoStream p_crypto_stream;
    2829        private bool stop = false;
     30        private IControlEncryption controlSlave;
    2931        #endregion
    3032
     
    164166        public void Execute()
    165167        {
    166             process(settings.Action);
     168            try
     169            {
     170                //copy inputStream for Slave
     171                if (controlSlave is object && InputStream is object && InputIV is object)
     172                {
     173                    CryptoolStream cs = new CryptoolStream();
     174                    cs.OpenRead(inputStream.FileName);
     175                    ((DESControl)controlSlave).InputStream = cs;
     176                }
     177
     178                process(settings.Action);
     179
     180                //Work with slave
     181                if (controlSlave is object && InputStream is object && InputIV is object)
     182                {
     183                    ((DESControl)controlSlave).onStatusChanged();
     184
     185                }
     186            }
     187            finally
     188            {
     189                if (controlSlave is object && ((DESControl)controlSlave).InputStream is object)
     190                    ((DESControl)controlSlave).InputStream.Close();
     191            }
    167192        }
    168193
     
    306331        }
    307332
     333        public bool isStopped(){
     334
     335            return this.stop;
     336        }
     337
    308338        public void PostExecution()
    309339        {
     
    337367
    338368        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
    339         private void GuiLogMessage(string message, NotificationLevel logLevel)
     369        public void GuiLogMessage(string message, NotificationLevel logLevel)
    340370        {
    341371          if (OnGuiLogNotificationOccured != null)
     
    361391        #endregion
    362392
    363         private IControlEncryption controlSlave;
    364393        [PropertyInfo(Direction.ControlSlave, "DES Slave", "Direct access to DES.", "", DisplayLevel.Beginner)]
    365394        public IControlEncryption ControlSlave
     
    379408        public event IControlStatusChangedEventHandler OnStatusChanged;
    380409        private DES plugin;
     410        private SymmetricAlgorithm des_algorithm = null;
     411       
     412        public CryptoolStream InputStream{
     413            get;set;
     414        }
    381415
    382416        public DESControl(DES Plugin)
     
    389423        public byte[] Encrypt(byte[] key, int blocksize)
    390424        {
    391             ((DESSettings)plugin.Settings).Action = 0;
    392             return execute(key);
     425            /// not implemented, currently not needed
     426            return null;
    393427        }
    394428
    395429        public byte[] Decrypt(byte[] key, int blocksize)
    396430        {
    397             ((DESSettings)plugin.Settings).Action = 1;
    398             return execute(key);
     431            int size = (int)this.InputStream.Length;
     432            if (blocksize < size)
     433                size = blocksize;
     434
     435            byte[] input = new byte[size];
     436            this.InputStream.Seek(0, 0);
     437            for (int i = 0; i < size && i < this.InputStream.Length; i++)
     438                input[i] = (byte)this.InputStream.ReadByte();
     439
     440            Stream inputStream = new MemoryStream(input);           
     441                       
     442            CryptoStream p_crypto_stream = null;
     443            byte[] output = new byte[blocksize];
     444
     445            //Decrypt Stream
     446            try
     447            {
     448                if (!(des_algorithm is object))
     449                {
     450                    des_algorithm = new DESCryptoServiceProvider();                   
     451                }
     452               
     453                this.ConfigureAlg(des_algorithm, key);
     454               
     455                ICryptoTransform p_decryptor;
     456                try
     457                {
     458                    p_decryptor = des_algorithm.CreateDecryptor();
     459                }               
     460                catch
     461                {
     462                    //dirty hack to allow weak keys:
     463                    MethodInfo mi = des_algorithm.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
     464                    object[] Par = { des_algorithm.Key, des_algorithm.Mode, des_algorithm.IV, des_algorithm.FeedbackSize, 0 };
     465                    p_decryptor = mi.Invoke(des_algorithm, Par) as ICryptoTransform;
     466                }
     467
     468                p_crypto_stream = new CryptoStream((Stream)inputStream, p_decryptor, CryptoStreamMode.Read);
     469
     470                byte[] buffer = new byte[des_algorithm.BlockSize / 8];
     471                int bytesRead;
     472                int position = 0;
     473
     474                while ((bytesRead = p_crypto_stream.Read(buffer, 0, buffer.Length)) > 0 && !plugin.isStopped())
     475                {
     476                    for (int i = 0; i < bytesRead; i++)
     477                    {
     478                        if (position + i < output.Length)
     479                        {
     480                            output[position + i] = buffer[i];
     481                        }
     482                        else
     483                        {
     484                            break;
     485                        }
     486                    }                   
     487                    position += bytesRead;
     488                }
     489
     490                p_crypto_stream.Flush();
     491
     492            }
     493            catch (Exception exception)
     494            {
     495                plugin.GuiLogMessage(exception.Message, NotificationLevel.Error);
     496                plugin.GuiLogMessage(exception.StackTrace, NotificationLevel.Error);
     497                des_algorithm = null;   // we got an exception so we do not use this object any more
     498            }
     499            finally
     500            {
     501                if(inputStream != null)
     502                    inputStream.Close();
     503            }
     504
     505            return output;
     506        }
     507
     508        private void ConfigureAlg(SymmetricAlgorithm alg, byte[] key)
     509        {
     510            try
     511            {
     512                alg.Key = key;
     513            }
     514            catch
     515            {
     516                //dirty hack to allow weak keys:
     517                FieldInfo field = des_algorithm.GetType().GetField("KeyValue", BindingFlags.NonPublic | BindingFlags.Instance);
     518                field.SetValue(alg, key);
     519            }
     520
     521            try
     522            {
     523                alg.IV = this.plugin.InputIV;
     524            }
     525            catch
     526            {
     527                //dirty hack to allow weak keys:
     528                FieldInfo field = des_algorithm.GetType().GetField("IVValue", BindingFlags.NonPublic | BindingFlags.Instance);
     529                field.SetValue(alg, this.plugin.InputIV);
     530            }
     531
     532            switch (((DESSettings)plugin.Settings).Mode)
     533            { //0="ECB"=default, 1="CBC", 2="CFB", 3="OFB"
     534                case 1: alg.Mode = CipherMode.CBC; break;
     535                case 2: alg.Mode = CipherMode.CFB; break;
     536                case 3: alg.Mode = CipherMode.OFB; break;
     537                default: alg.Mode = CipherMode.ECB; break;
     538            }
     539            switch (((DESSettings)plugin.Settings).Padding)
     540            { //0="Zeros"=default, 1="None", 2="PKCS7"
     541                case 1: alg.Padding = PaddingMode.None; break;
     542                case 2: alg.Padding = PaddingMode.PKCS7; break;
     543                case 3: alg.Padding = PaddingMode.ANSIX923; break;
     544                case 4: alg.Padding = PaddingMode.ISO10126; break;
     545                default: alg.Padding = PaddingMode.Zeros; break;
     546            }
     547           
     548        }
     549
     550        /// <summary>
     551        /// Called by DES if its status changes
     552        /// </summary>
     553        public void onStatusChanged()
     554        {
     555            if (OnStatusChanged != null)
     556                OnStatusChanged(this, true);
    399557        }
    400558
     
    408566        {
    409567            byte[] bkey = new byte[8];
    410             for (int i = 0; i < 7; i++)
     568            for (int i = 0; i <= 7; i++)
    411569            {
    412570                bkey[i] = Convert.ToByte(key.Substring(i * 3, 2), 16);               
    413571            }
    414572            return bkey;
    415         }
    416 
    417         private byte[] execute(byte[] key)
    418         {
    419             plugin.InputKey = key;
    420             plugin.Execute();
    421             CryptoolStream output = plugin.OutputStream;
    422 
    423             byte[] byteValues = new byte[output.Length];
    424             int bytesRead;
    425             output.Seek(0, SeekOrigin.Begin);
    426             bytesRead = output.Read(byteValues, 0, byteValues.Length);
    427             plugin.Dispose();
    428             output.Close();
    429             return byteValues;
    430573        }
    431574
Note: See TracChangeset for help on using the changeset viewer.