⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc5.cs

📁 rc5 enc/dec unit you can encrypt or decryot you strings from this unit
💻 CS
字号:
/*
 * programmed by george batres
 * according to RC5 algorithm
 * with a little change
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Rc5_v2
{
    class Rc5
    {
        uint[] s;
        uint[] l;
        uint b, u, t, c;
        byte[] key;
        int rounds;

        public Rc5()
        {
            string str = "georgebatres";
            key = GetKeyFromString(str);
            rounds = 16;
            b = (uint)key.Length;
            u = 4;
            t = (uint)(34);
            c = 12 / u;
            s = new uint[34];
            l = new uint[12];

            GenerateKey(key, rounds);
        }
        
        public Rc5(string password,int round)
        {
            key = GetKeyFromString(password);
            rounds = round;
            b = (uint)key.Length;
            u = 4;
            t = (uint)(2 * rounds + 2);
            c = Math.Max(b, 1) / u;
            s = new uint[2 * rounds + 2];
            l = new uint[key.Length];

            GenerateKey(key, rounds);
        }
        
        public Rc5(byte[] password, int round)
        {
            rounds = round;
            key = password;
            b = (uint)password.Length;
            u = 4;
            t = (uint)(2 * rounds + 2);
            c = Math.Max(b, 1) / u;
            s = new uint[2 * rounds + 2];
            l = new uint[password.Length];

            GenerateKey(key, rounds);
        }
        //to circulate int left
        private uint leftRotate(uint x, int offset)
        {
            uint t1, t2;
            t1 = x >> (32 - offset);
            t2 = x << offset;
            return t1 | t2;
        }
        //to circulate int right
        private uint RightRotate(uint x, int offset)
        {
            uint t1, t2;
            t1 = x << (32 - offset);
            t2 = x >> offset;
            return t1 | t2;
        }
        //encryption operation on two block
        private void Encode(ref uint r1, ref uint r2, int rounds)
        {
            r1 = r1 + s[0];
            r2 = r2 + s[1];
            for (int i = 1; i <= rounds; i++)
            {
                r1 = leftRotate(r1 ^ r2, (int)r2) + s[2 * i];
                r2 = leftRotate(r2 ^ r1, (int)r1) + s[2 * i + 1];
            }
        }
        //decryption operation on two block
        private void Decode(ref uint r1, ref uint r2, int rounds)
        {
            for (int i = rounds; i >= 1; i--)
            {
                r2 = (RightRotate(r2 - s[2 * i + 1], (int)r1)) ^ r1;
                r1 = (RightRotate(r1 - s[2 * i], (int)r2)) ^ r2;
            }
            r2 = r2 - s[1];
            r1 = r1 - s[0];
        }

        private void GenerateKey(byte[] key, int rounds)
        {
            uint P32 = uint.Parse("b7e15163", System.Globalization.NumberStyles.HexNumber);
            uint Q32 = uint.Parse("9e3779b9", System.Globalization.NumberStyles.HexNumber);


            for (int i = key.Length - 1; i >= 0; i--)
            {
                l[i] = leftRotate((uint)i, 8) + key[i];
            }

            s[0] = P32;
            for (int i = 1; i <= t - 1; i++)
            {
                s[i] = s[i - 1] + Q32;
            }

            uint ii, jj;
            ii = jj = 0;
            uint x, y;
            x = y = 0;
            uint v = 3 * Math.Max(t, c);
            //mixing key arrayes
            for (int counter = 0; counter <= v; counter++)
            {
                x = s[ii] = leftRotate((s[ii] + x + y), 3);
                y = l[jj] = leftRotate((l[jj] + x + y), (int)(x + y));
                ii = (ii + 1) % t;
                jj = (jj + 1) % c;
            }
        }
        //convert key from string to byte array
        private byte[] GetKeyFromString(string str)
        {
            char[] mykeyinchar = str.ToCharArray();
            byte[] mykeyinbytes = new byte[mykeyinchar.Length];
            for (int i = 0; i < mykeyinchar.Length; i++)
            {
                mykeyinbytes[i] = (byte)mykeyinchar[i];
            }
            return mykeyinbytes;
        }

        public void Encrypt(FileStream streamreader,FileStream streamwriter)
        {
            uint r1, r2;

            System.IO.BinaryReader br = new System.IO.BinaryReader(streamreader);
            System.IO.BinaryWriter bw = new System.IO.BinaryWriter(streamwriter);
            long filelength = streamreader.Length;
            while (filelength > 0)
            {
                try
                {
                    r1 = br.ReadUInt32();
                    try
                    {
                        r2 = br.ReadUInt32();
                    }
                    catch
                    {
                        r2 = 0;
                    }
                }
                catch
                {
                    r1 = r2 = 0;
                }

                Encode(ref r1, ref r2, rounds);
                bw.Write(r1);
                bw.Write(r2);

                filelength -= 8;
            }

            streamreader.Close();
            streamwriter.Close();
            
        }

        public void Decrypt(FileStream streamreader,FileStream streamwriter)
        {
            uint r1, r2;

            System.IO.BinaryReader br = new System.IO.BinaryReader(streamreader);
            System.IO.BinaryWriter bw = new System.IO.BinaryWriter(streamwriter);
            long filelength = streamreader.Length;
            while (filelength > 0)
            {
                try
                {
                    r1 = br.ReadUInt32();
                    r2 = br.ReadUInt32();
                    Decode(ref r1, ref r2, rounds);

                    if (!(r1 == 0 && r2 == 0 && (filelength - 8 <= 0)))
                    {
                        bw.Write(r1);
                        bw.Write(r2);
                    }
                    if (r2 == 0 && (filelength - 8 <= 0))
                    {
                        bw.Write(r1);
                    }
                    filelength -= 8;
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("May be U try to decrypt an normal file (plain file)", "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                    return;
                }
            }

            streamreader.Close();
            streamwriter.Close();
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -