Changeset 1040 for trunk/CrypPlugins/DES


Ignore:
Timestamp:
Dec 21, 2009, 3:32:38 PM (12 years ago)
Author:
oruba
Message:

Implementation of IControl-Interface to perform cube attacks to DES.
Please note that DES is probably immune against cube attacks, so no linear superpolys will be found in the preprocessing.

Location:
trunk/CrypPlugins/DES
Files:
2 edited

Legend:

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

    r1020 r1040  
    1212using Cryptool.PluginBase.Control;
    1313using System.Reflection;
     14// Reference to the CubeAttackController interface (own dll)
     15using Cryptool.CubeAttackController;
    1416
    1517namespace Cryptool.Plugins.Cryptography.Encryption
     
    172174                {
    173175                    CryptoolStream cs = new CryptoolStream();
    174                     cs.OpenRead(inputStream.FileName);
     176                    cs.OpenRead(inputStream.FileName); 
    175177                    ((DESControl)controlSlave).InputStream = cs;
    176178                }
     
    240242                    }
    241243                }
     244
    242245                p_crypto_stream.Flush();
    243246                outputStream.Close();
     
    404407              return controlSlave;
    405408          }
    406         }   
     409        }
     410
     411        private IControlCubeAttack desSlave;
     412        [PropertyInfo(Direction.ControlSlave, "DES for cube attack", "Direct access to DES.", "", DisplayLevel.Beginner)]
     413        public IControlCubeAttack DESSlave
     414        {
     415            get
     416            {
     417                if (desSlave == null)
     418                    desSlave = new CubeAttackControl(this);
     419                return desSlave;
     420            }
     421        }
    407422    }
     423
     424    #region DESControl : IControlCubeAttack
     425
     426    public class CubeAttackControl : IControlCubeAttack
     427    {
     428        public event IControlStatusChangedEventHandler OnStatusChanged;
     429        private DES plugin;
     430
     431        public CubeAttackControl(DES Plugin)
     432        {
     433            this.plugin = Plugin;
     434        }
     435
     436        #region IControlEncryption Members
     437
     438        public int GenerateBlackboxOutputBit(object IV, object key, object length)
     439        {
     440            // public bits := plaintext
     441            // secret bits := key
     442            SymmetricAlgorithm p_alg = new DESCryptoServiceProvider();
     443            string secretBits = string.Empty;
     444            string publicBits = string.Empty;
     445
     446            // save public and secret bits as string
     447            int[] temp = key as int[];
     448            for (int i = 0; i < temp.Length; i++)
     449                secretBits += temp[i];
     450            temp = IV as int[];
     451            for (int i = 0; i < temp.Length; i++)
     452                publicBits += temp[i];
     453
     454            // convert secret bits to byte array
     455            int[] arrInt = new int[8];
     456            for (int i = 0; i < 8; i++)
     457            {
     458                for (int j = 0; j < 8; j++)
     459                {
     460                    if (secretBits[(8 * i) + j] == '1')
     461                        arrInt[i] += (int)Math.Pow(2, 7 - j);
     462                }
     463            }
     464            byte[] keyByte = new byte[8];
     465            for (int i = 0; i < arrInt.Length; i++)
     466                keyByte[i] = (byte)arrInt[i];
     467
     468            // convert public bits to byte array
     469            arrInt = new int[8];
     470            for (int i = 0; i < 8; i++)
     471            {
     472                for (int j = 0; j < 8; j++)
     473                {
     474                    if (publicBits[(8 * i) + j] == '1')
     475                        arrInt[i] += (int)Math.Pow(2, 7 - j);
     476                }
     477            }
     478            byte[] publicByte = new byte[8];
     479            for (int i = 0; i < arrInt.Length; i++)
     480                publicByte[i] = (byte)arrInt[i];
     481
     482            ICryptoTransform p_encryptor;
     483            p_alg.IV = new byte[8];
     484            p_alg.Padding = PaddingMode.Zeros;
     485            try
     486            {
     487                p_alg.Key = keyByte;
     488            }
     489            catch
     490            {
     491                //dirty hack to allow weak keys:
     492                FieldInfo field = p_alg.GetType().GetField("KeyValue", BindingFlags.NonPublic | BindingFlags.Instance);
     493                field.SetValue(p_alg, keyByte);
     494            }
     495            try
     496            {
     497                p_encryptor = p_alg.CreateEncryptor();
     498            }
     499            catch
     500            {
     501                //dirty hack to allow weak keys:
     502                MethodInfo mi = p_alg.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
     503                object[] Par = { p_alg.Key, p_alg.Mode, p_alg.IV, p_alg.FeedbackSize, 0 };
     504                p_encryptor = mi.Invoke(p_alg, Par) as ICryptoTransform;
     505            }
     506           
     507            Stream inputPublic = new MemoryStream(publicByte);
     508            // starting encryption
     509            CryptoStream p_crypto_stream = new CryptoStream(inputPublic, p_encryptor, CryptoStreamMode.Read);
     510            byte[] buffer = new byte[p_alg.BlockSize / 8];
     511            p_crypto_stream.Read(buffer, 0, buffer.Length);
     512               
     513            // convert encrypted block to binary string
     514            string strBytes = string.Empty;
     515            for (int i = 0; i < buffer.Length; i++)
     516            {
     517                for (int j = 7; j >= 0; j--)
     518                    strBytes += (buffer[i] & 1 << j) > 0 ? 1 : 0;
     519            }
     520            p_crypto_stream.Flush();
     521
     522            // return single output bit
     523            return Int32.Parse(strBytes.Substring((int)length-1, 1));
     524        }
     525        #endregion
     526    }
     527
     528    #endregion
    408529
    409530    public class DESControl : IControlEncryption
  • trunk/CrypPlugins/DES/DES.csproj

    r516 r1040  
    7979      <Name>CrypPluginBase</Name>
    8080    </ProjectReference>
     81    <ProjectReference Include="..\CubeAttackController\CubeAttackController.csproj">
     82      <Project>{2100AC2F-3F2B-48A2-AF42-87EC52C8A703}</Project>
     83      <Name>CubeAttackController</Name>
     84    </ProjectReference>
    8185  </ItemGroup>
    8286  <ItemGroup>
Note: See TracChangeset for help on using the changeset viewer.