Changeset 1080 for trunk/CrypPlugins/DES


Ignore:
Timestamp:
Jan 14, 2010, 7:55:05 PM (12 years ago)
Author:
Matthäus Wander
Message:

added another Decrypt(...) override for DES to pass ciphertext.
Supports only ECB. Support for other modes missing

File:
1 edited

Legend:

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

    r1040 r1080  
    565565        {
    566566            /// not implemented, currently not needed
    567             return null;
    568         }
    569 
     567            throw new NotImplementedException();
     568        }
     569
     570        // TODO: add override with iv, mode, blocksize
     571        public byte[] Decrypt(byte[] ciphertext, byte[] key)
     572        {
     573            CryptoStream crypto_stream = null;
     574            byte[] output = new byte[8];
     575
     576            try
     577            {
     578                if (des_algorithm == null)
     579                {
     580                    des_algorithm = new DESCryptoServiceProvider();
     581                }
     582
     583                try
     584                {
     585                    des_algorithm.Key = key;
     586                }
     587                catch
     588                {
     589                    //dirty hack to allow weak keys:
     590                    FieldInfo field = des_algorithm.GetType().GetField("KeyValue", BindingFlags.NonPublic | BindingFlags.Instance);
     591                    Console.WriteLine(des_algorithm.GetType());
     592                    field.SetValue(des_algorithm, key);
     593                }
     594
     595                ICryptoTransform p_decryptor;
     596                try
     597                {
     598                    p_decryptor = des_algorithm.CreateDecryptor();
     599                }
     600                catch
     601                {
     602                    //dirty hack to allow weak keys:
     603                    MethodInfo mi = des_algorithm.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
     604                    object[] Par = { des_algorithm.Key, des_algorithm.Mode, des_algorithm.IV, des_algorithm.FeedbackSize, 0 };
     605                    p_decryptor = mi.Invoke(des_algorithm, Par) as ICryptoTransform;
     606                }
     607
     608                crypto_stream = new CryptoStream(new MemoryStream(ciphertext, false), p_decryptor, CryptoStreamMode.Read);
     609
     610                int read, readOverall = 0;
     611                do
     612                {
     613                    read = crypto_stream.Read(output, readOverall, output.Length - readOverall);
     614                    readOverall += read;
     615                } while (read > 0 && readOverall < output.Length);
     616            }
     617            catch (Exception exception)
     618            {
     619                des_algorithm = null;   // we got an exception so we do not use this object any more
     620                throw exception;
     621            }
     622
     623            return output;
     624
     625            //try
     626            //{
     627            //    des_algorithm.IV = this.plugin.InputIV;
     628            //}
     629            //catch
     630            //{
     631            //    //dirty hack to allow weak keys:
     632            //    FieldInfo field = des_algorithm.GetType().GetField("IVValue", BindingFlags.NonPublic | BindingFlags.Instance);
     633            //    field.SetValue(des_algorithm, this.plugin.InputIV);
     634            //}
     635
     636            //switch (((DESSettings)plugin.Settings).Mode)
     637            //{ //0="ECB"=default, 1="CBC", 2="CFB", 3="OFB"
     638            //    case 1: alg.Mode = CipherMode.CBC; break;
     639            //    case 2: alg.Mode = CipherMode.CFB; break;
     640            //    case 3: alg.Mode = CipherMode.OFB; break;
     641            //    default: alg.Mode = CipherMode.ECB; break;
     642            //}
     643            //switch (((DESSettings)plugin.Settings).Padding)
     644            //{ //0="Zeros"=default, 1="None", 2="PKCS7"
     645            //    case 1: alg.Padding = PaddingMode.None; break;
     646            //    case 2: alg.Padding = PaddingMode.PKCS7; break;
     647            //    case 3: alg.Padding = PaddingMode.ANSIX923; break;
     648            //    case 4: alg.Padding = PaddingMode.ISO10126; break;
     649            //    default: alg.Padding = PaddingMode.Zeros; break;
     650            //}
     651        }
     652
     653        [Obsolete("this signature doesn't pass the ciphertext, use Decrypt(byte[], byte[]) instead")]
    570654        public byte[] Decrypt(byte[] key, int blocksize)
    571655        {
    572656            int size = (int)this.InputStream.Length;
    573            
     657
    574658            if (blocksize < size)
    575659                size = blocksize;
    576            
     660
    577661            if (!(this.input is object))
    578662            {
     
    584668            }
    585669            inputStream.Seek(0, 0);
    586                        
     670
    587671            CryptoStream crypto_stream = null;
    588672            byte[] output = new byte[blocksize];
     
    593677                if (!(des_algorithm is object))
    594678                {
    595                     des_algorithm = new DESCryptoServiceProvider();                   
    596                 }
    597                
     679                    des_algorithm = new DESCryptoServiceProvider();
     680                }
     681
    598682                this.ConfigureAlg(des_algorithm, key);
    599                
     683
    600684                ICryptoTransform p_decryptor;
    601685                try
    602686                {
    603687                    p_decryptor = des_algorithm.CreateDecryptor();
    604                 }               
     688                }
    605689                catch
    606690                {
     
    629713                            break;
    630714                        }
    631                     }                   
     715                    }
    632716                    position += bytesRead;
    633717                }
     
    639723                des_algorithm = null;   // we got an exception so we do not use this object any more
    640724                throw exception;
    641             }           
     725            }
    642726
    643727            return output;
    644728        }
    645729
     730        [Obsolete("being used by obsolete Decrypt(byte[], int)")]
    646731        private void ConfigureAlg(SymmetricAlgorithm alg, byte[] key)
    647732        {
     
    683768                default: alg.Padding = PaddingMode.Zeros; break;
    684769            }
    685            
     770
    686771        }
    687772
Note: See TracChangeset for help on using the changeset viewer.