Changeset 786


Ignore:
Timestamp:
Oct 27, 2009, 12:56:23 PM (12 years ago)
Author:
kopal
Message:
  • AES now works with the KeySearcher
  • Added sample for key searching with AES
  • Some Bug fixes on DES with KeySearcher
Location:
trunk
Files:
3 edited
1 moved

Legend:

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

    r717 r786  
    217217using System.Runtime.Remoting.Contexts;
    218218using Cryptool.PluginBase.Control;
     219using System.Reflection;
    219220
    220221namespace Cryptool.Plugins.Cryptography.Encryption
     
    414415
    415416        public void Execute()
    416         {           
    417             process(settings.Action);
     417        {
     418            try
     419            {
     420                //copy inputStream for Slave
     421                if (controlSlave is object && InputStream is object && InputIV is object)
     422                {
     423                    CryptoolStream cs = new CryptoolStream();
     424                    cs.OpenRead(inputStream.FileName);
     425                    ((AESControl)controlSlave).InputStream = cs;
     426                }
     427
     428                process(settings.Action);
     429
     430                //Work with slave
     431                if (controlSlave is object && InputStream is object && InputIV is object)
     432                {
     433                    ((AESControl)controlSlave).reset();
     434                    ((AESControl)controlSlave).onStatusChanged();
     435
     436                }
     437            }
     438            finally
     439            {
     440                if (controlSlave is object && ((AESControl)controlSlave).InputStream is object)
     441                    ((AESControl)controlSlave).closeStreams();
     442                //InputStream = null;
     443                //OutputStream = null;
     444            }
     445        }
     446
     447        public bool isStopped()
     448        {
     449
     450            return this.stop;
    418451        }
    419452
     
    424457          {
    425458            checkForInputStream();
    426             if (inputStream == null || (inputStream != null && inputStream.Length == 0))
     459            if (inputStream == null || inputStream.Length == 0)
    427460            {
    428461              GuiLogMessage("No input given. Not using dummy data in decrypt mode. Aborting now.", NotificationLevel.Error);
     
    658691        public event IControlStatusChangedEventHandler OnStatusChanged;
    659692        private AES plugin;
     693        private SymmetricAlgorithm aes_algorithm = null;
     694        private byte[] input;
     695        private Stream inputStream;
     696
     697        public void reset()
     698        {
     699            input = null;
     700            aes_algorithm = null;
     701        }
     702
     703        public CryptoolStream InputStream{
     704            get;set;
     705        }
    660706
    661707        public AESControl(AES Plugin)
    662708        {
    663709            this.plugin = Plugin;
    664             ((AESSettings)plugin.Settings).PropertyChanged += settingsChangedHandler;
    665710        }
    666711
     
    669714        public byte[] Encrypt(byte[] key, int blocksize)
    670715        {
    671             ((AESSettings)plugin.Settings).Action = 0;
    672             return execute(key, blocksize);
     716            /// not implemented, currently not needed
     717            return null;
     718        }
     719
     720        public void closeStreams()
     721        {
     722            if (inputStream != null)
     723                inputStream.Close();
     724            if (InputStream != null)
     725                InputStream.Close();
    673726        }
    674727
    675728        public byte[] Decrypt(byte[] key, int blocksize)
    676729        {
    677             ((AESSettings)plugin.Settings).Action = 1;
    678             return execute(key, blocksize);
     730            int size = (int)this.InputStream.Length;
     731           
     732            if (blocksize < size)
     733                size = blocksize;
     734           
     735            if (!(this.input is object))
     736            {
     737                input = new byte[size];
     738                this.InputStream.Seek(0, 0);
     739                for (int i = 0; i < size && i < this.InputStream.Length; i++)
     740                    input[i] = (byte)this.InputStream.ReadByte();
     741                inputStream = new MemoryStream(input);
     742            }
     743            inputStream.Seek(0, 0);
     744
     745            CryptoStream crypto_stream = null;
     746            byte[] output = new byte[blocksize];
     747
     748            //Decrypt Stream
     749            try
     750            {
     751                if (!(aes_algorithm is object))
     752                {
     753                    if (((AESSettings)plugin.Settings).CryptoAlgorithm == 1)
     754                    { aes_algorithm = new RijndaelManaged(); }
     755                    else
     756                    { aes_algorithm = new AesCryptoServiceProvider(); }                   
     757                }
     758               
     759                this.ConfigureAlg(aes_algorithm, key);
     760               
     761                ICryptoTransform p_decryptor;
     762                try
     763                {
     764                    p_decryptor = aes_algorithm.CreateDecryptor();
     765                }               
     766                catch
     767                {
     768                    //dirty hack to allow weak keys:
     769                    MethodInfo mi = aes_algorithm.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
     770                    object[] Par = { aes_algorithm.Key, aes_algorithm.Mode, aes_algorithm.IV, aes_algorithm.FeedbackSize, 0 };
     771                    p_decryptor = mi.Invoke(aes_algorithm, Par) as ICryptoTransform;
     772                }
     773
     774                crypto_stream = new CryptoStream((Stream)inputStream, p_decryptor, CryptoStreamMode.Read);
     775
     776                byte[] buffer = new byte[aes_algorithm.BlockSize / 8];
     777                int bytesRead;
     778                int position = 0;
     779
     780                while ((bytesRead = crypto_stream.Read(buffer, 0, buffer.Length)) > 0 && !plugin.isStopped())
     781                {
     782                    for (int i = 0; i < bytesRead; i++)
     783                    {
     784                        if (position + i < output.Length)
     785                        {
     786                            output[position + i] = buffer[i];
     787                        }
     788                        else
     789                        {
     790                            break;
     791                        }
     792                    }                   
     793                    position += bytesRead;
     794                }
     795
     796            }
     797            catch (Exception exception)
     798            {
     799                aes_algorithm = null;   // we got an exception so we do not use this object any more
     800                throw exception;
     801            }           
     802
     803            return output;
     804        }
     805
     806        private void ConfigureAlg(SymmetricAlgorithm alg, byte[] key)
     807        {
     808            try
     809            {
     810                alg.Key = key;
     811            }
     812            catch
     813            {
     814                //dirty hack to allow weak keys:
     815                FieldInfo field = aes_algorithm.GetType().GetField("KeyValue", BindingFlags.NonPublic | BindingFlags.Instance);
     816                field.SetValue(alg, key);
     817            }
     818
     819            try
     820            {
     821                alg.IV = this.plugin.InputIV;
     822            }
     823            catch
     824            {
     825                //dirty hack to allow weak keys:
     826                FieldInfo field = aes_algorithm.GetType().GetField("IVValue", BindingFlags.NonPublic | BindingFlags.Instance);
     827                field.SetValue(alg, this.plugin.InputIV);
     828            }
     829
     830            switch (((AESSettings)plugin.Settings).Mode)
     831            { //0="ECB"=default, 1="CBC", 2="CFB", 3="OFB"
     832                case 1: alg.Mode = CipherMode.CBC; break;
     833                case 2: alg.Mode = CipherMode.CFB; break;
     834                case 3: alg.Mode = CipherMode.OFB; break;
     835                default: alg.Mode = CipherMode.ECB; break;
     836            }
     837            switch (((AESSettings)plugin.Settings).Padding)
     838            { //0="Zeros"=default, 1="None", 2="PKCS7"
     839                case 1: alg.Padding = PaddingMode.None; break;
     840                case 2: alg.Padding = PaddingMode.PKCS7; break;
     841                case 3: alg.Padding = PaddingMode.ANSIX923; break;
     842                case 4: alg.Padding = PaddingMode.ISO10126; break;
     843                default: alg.Padding = PaddingMode.Zeros; break;
     844            }
     845           
     846        }
     847
     848        /// <summary>
     849        /// Called by AES if its status changes
     850        /// </summary>
     851        public void onStatusChanged()
     852        {
     853            if (OnStatusChanged != null)
     854                OnStatusChanged(this, true);
    679855        }
    680856
     
    723899            return bkey;
    724900        }
    725 
    726         private byte[] execute(byte[] key, int blocksize)
    727         {
    728             plugin.InputKey = key;
    729             plugin.Execute();
    730             CryptoolStream output = plugin.OutputStream;
    731 
    732             byte[] byteValues = new byte[output.Length];
    733             int bytesRead;
    734             output.Seek(0, SeekOrigin.Begin);
    735             bytesRead = output.Read(byteValues, 0, byteValues.Length);
    736             plugin.Dispose();
    737             output.Close();
    738             return byteValues;
    739         }
    740 
    741         private void settingsChangedHandler(object sender, PropertyChangedEventArgs e)
    742         {
    743             if (e.PropertyName == "Keysize")
    744                 keyPatternChanged();
    745         }
    746 
    747901        #endregion
    748902    }
  • trunk/CrypPlugins/CostFunction/CostFunction.cs

    r761 r786  
    373373                throw new Exception("Entered bytesToUse is not an integer: " + ex.Message);
    374374            }
     375           
     376            if (bytesToUse > text.Length)
     377                bytesToUse = text.Length;
     378
    375379            byte[] array;
    376380
  • trunk/CrypPlugins/DES/DES.cs

    r785 r786  
    181181                if (controlSlave is object && InputStream is object && InputIV is object)
    182182                {
     183                    ((DESControl)controlSlave).reset();
    183184                    ((DESControl)controlSlave).onStatusChanged();
    184185
     
    188189            {
    189190                if (controlSlave is object && ((DESControl)controlSlave).InputStream is object)
    190                     ((DESControl)controlSlave).InputStream.Close();
     191                    ((DESControl)controlSlave).closeStreams();
    191192                InputStream = null;
    192193                OutputStream = null;
     
    411412        private DES plugin;
    412413        private SymmetricAlgorithm des_algorithm = null;
    413        
     414        private byte[] input;
     415        private Stream inputStream;
     416 
    414417        public CryptoolStream InputStream{
    415418            get;set;
    416419        }
    417420
     421        public void reset()
     422        {
     423            input = null;
     424            des_algorithm = null;
     425        }
     426
     427        public void closeStreams()
     428        {
     429            if (inputStream != null)
     430                inputStream.Close();
     431            if (InputStream != null)
     432                InputStream.Close();
     433        }
     434
    418435        public DESControl(DES Plugin)
    419436        {
     
    432449        {
    433450            int size = (int)this.InputStream.Length;
     451           
    434452            if (blocksize < size)
    435453                size = blocksize;
    436 
    437             byte[] input = new byte[size];
    438             this.InputStream.Seek(0, 0);
    439             for (int i = 0; i < size && i < this.InputStream.Length; i++)
    440                 input[i] = (byte)this.InputStream.ReadByte();
    441 
    442             Stream inputStream = new MemoryStream(input);           
    443                        
    444             CryptoStream p_crypto_stream = null;
     454           
     455            if (!(this.input is object))
     456            {
     457                input = new byte[size];
     458                this.InputStream.Seek(0, 0);
     459                for (int i = 0; i < size && i < this.InputStream.Length; i++)
     460                    input[i] = (byte)this.InputStream.ReadByte();
     461                inputStream = new MemoryStream(input);
     462            }
     463            inputStream.Seek(0, 0);
     464                       
     465            CryptoStream crypto_stream = null;
    445466            byte[] output = new byte[blocksize];
    446467
     
    468489                }
    469490
    470                 p_crypto_stream = new CryptoStream((Stream)inputStream, p_decryptor, CryptoStreamMode.Read);
     491                crypto_stream = new CryptoStream((Stream)inputStream, p_decryptor, CryptoStreamMode.Read);
    471492
    472493                byte[] buffer = new byte[des_algorithm.BlockSize / 8];
     
    474495                int position = 0;
    475496
    476                 while ((bytesRead = p_crypto_stream.Read(buffer, 0, buffer.Length)) > 0 && !plugin.isStopped())
     497                while ((bytesRead = crypto_stream.Read(buffer, 0, buffer.Length)) > 0 && !plugin.isStopped())
    477498                {
    478499                    for (int i = 0; i < bytesRead; i++)
     
    490511                }
    491512
    492                 p_crypto_stream.Flush();
    493513
    494514            }
     
    497517                des_algorithm = null;   // we got an exception so we do not use this object any more
    498518                throw exception;
    499             }
    500             finally
    501             {
    502                 if(inputStream != null)
    503                     inputStream.Close();
    504             }
     519            }           
    505520
    506521            return output;
Note: See TracChangeset for help on using the changeset viewer.