示例#1
0
 private void InputData()
 {
     /*numericUpDown1.Value =20;
     textBox5.Text = "2";
     textBox2.Text = "1023";
     textBox3.Text = "32";
     textBox4.Text = "0";*/
     ulong x0 = Convert.ToUInt64(textBox5.Text);
     ulong m = Convert.ToUInt64(textBox2.Text);
     ulong a = Convert.ToUInt64(textBox3.Text);
     ulong c = Convert.ToUInt64(textBox4.Text);
     _myRandom = new MyRandom(x0, m, a, c);
 }
        private void EncryptStream(Stream inputStream, Stream outputStream)
        {
            byte[] key = _mKey;
            var s = GenerateSubKeys(key);
            ushort a0 = 0, b0 = 0, a, b;
            MyRandom myRandom = new MyRandom(31, 2147483647, 16807, 17711);
            a0 = (ushort) myRandom.random();//generate random a and b
            b0 = (ushort) myRandom.random();
            int w2 = (_mW << 1);
            var buffer = new byte[w2];//buffer of a and b
            inputStream.Position = 0;
            outputStream.Position = 0;
            int paddingLength = 0;
            int readBytesCount;
            do
            {//main cycle
                readBytesCount = inputStream.Read(buffer, 0, w2);
                if (readBytesCount == 0)
                    break;
                a = BitConverter.ToUInt16(buffer, 0);//get a
                b = BitConverter.ToUInt16(buffer, _mW);//get b
                EncryptBlock(ref a0, ref b0, ref a, ref b, s);
                outputStream.Write(BitConverter.GetBytes(a0), 0, _mW);
                outputStream.Write(BitConverter.GetBytes(b0), 0, _mW);
                if (readBytesCount < w2)//if the last block < w2
                    paddingLength = w2 - readBytesCount;//fill padding by random bytes

                if (OnProgressChanged != null)//calculate progress
                    OnProgressChanged((int)(inputStream.Position / (float)inputStream.Length * 100));
            } while (true);
            int countOfPaddingBlocks = _mKey.Length + 1;//space on md5 + length of prev padding
            countOfPaddingBlocks = countOfPaddingBlocks / w2 + (countOfPaddingBlocks / w2 > 0 ? 1 : 0);
            buffer = new byte[w2 * countOfPaddingBlocks];
            _mKey.CopyTo(buffer, 0);//password md5 padding
            buffer[buffer.Length - 1] = (byte)paddingLength;//padding length
            for (int i = 0; i < countOfPaddingBlocks; ++i)//padding filler
            {
                a = BitConverter.ToUInt16(buffer, i * w2);
                b = BitConverter.ToUInt16(buffer, i * w2 + _mW);
                EncryptBlock(ref a0, ref b0, ref a, ref b, s);
                outputStream.Write(BitConverter.GetBytes(a), 0, _mW);
                outputStream.Write(BitConverter.GetBytes(b), 0, _mW);
            }
            if (OnProgressChanged != null)
                OnProgressChanged(100);
        }
 public MyRC5(uint numberOfRounds, KeyLength keyLength, uint wordLength)
 {
     _numberOfRounds = (int) numberOfRounds;
     //_keyLength = keyLength;
     _wordLength = wordLength;
     switch (keyLength)
     {
         case KeyLength.KEY_LENGTH_16:
             _pw = P_16;
             _qw = Q_16;
             break;
         case KeyLength.KEY_LENGTH_32:
             _pw = P_32;
             _qw = Q_32;
             break;
         case KeyLength.KEY_LENGTH_64:
             _pw = P_64;
             _qw = Q_64;
             break;
     }
     _myRandom = new MyRandom(31, 2147483647, 16807, 17711);
     _myMd5 = new MyMD5();
 }
        private bool DecryptStream(Stream inputStream, Stream outputStream)
        {
            byte[] key = _mKey; //key in byte format
            var s = GenerateSubKeys(key);
            ushort a0 = 0, b0 = 0, a, b;
            MyRandom myRandom = new MyRandom(31, 2147483647, 16807, 17711);
            a0 = (ushort) myRandom.random();//generate random a and b
            b0 = (ushort) myRandom.random();
            int w2 = _mW << 1, i, l = _mKey.Length + 1;
            var buffer = new byte[w2];
            inputStream.Position = 0;
            outputStream.Position = 0;
            l = l / w2 + (l / w2 > 0 ? 1 : 0);//number of padding blocks
            do
            {
                inputStream.Read(buffer, 0, w2);
                a = BitConverter.ToUInt16(buffer, 0);
                b = BitConverter.ToUInt16(buffer, _mW);
                DecryptBlock(ref a0, ref b0, ref a, ref b, s);
                outputStream.Write(BitConverter.GetBytes(a), 0, _mW);
                outputStream.Write(BitConverter.GetBytes(b), 0, _mW);

                if (OnProgressChanged != null)//calculate progress
                    OnProgressChanged((int)(inputStream.Position / (float)inputStream.Length * 100));
            } while (inputStream.Position < inputStream.Length - l * w2 - w2);
            byte[] padding = new byte[l * w2 + w2];
            MemoryStream paddingStream = new MemoryStream(padding);
            paddingStream.Position = 0;
            do
            {
                inputStream.Read(buffer, 0, w2); //padding
                a = BitConverter.ToUInt16(buffer, 0);
                b = BitConverter.ToUInt16(buffer, _mW);
                DecryptBlock(ref a0, ref b0, ref a, ref b, s);
                paddingStream.Write(BitConverter.GetBytes(a), 0, _mW);
                paddingStream.Write(BitConverter.GetBytes(b), 0, _mW);

            } while (inputStream.Position < inputStream.Length);
            for (i = 0; i < _mKey.Length; ++i)//check md5
            {//16-31 password md5
                if (_mKey[i] != padding[i + 16/4])
                {
                    //MessageBox.Show("not right password");
                    if (OnDecryptedPasswordFailed != null)
                        OnDecryptedPasswordFailed();
                    return false;
                }
            }
            int len = padding[padding.Length - 1];
            outputStream.Write(padding, 0, w2 - len);
            if (OnProgressChanged != null)//calculate process
                OnProgressChanged(100);
            return true;
        }