C# RC4Engine(加密/解密)

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

RC4是密钥长度可变的流加密算法簇。其核心部分的S-box长度无限制

,该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非

线性。RC4包括初始化算法(KSA)与伪随机数生成算法(PRGA)两个部分。

        public static byte[] rc4_init(string key)
        {
            byte[] box = new byte[255];
            for (int i = 0; i < 255; i++)
                box[i] = (byte)i;
            for (int i = 0, j = 0; i < 255; i++)
            {
                j = (j + box[i] + key[i % key.Length]) % 255;
                byte b = box[i];
                box[i] = box[j];
                box[j] = b;
            }
            return box;
        }

上面是初始化算法主要随机打烂S-box中的密钥序列顺序与初始化

Key值。首先定义一个byte[] box缓冲区,然后进行首次的循环,

把S-Box赋入初值,第二次循环进行随机打烂S-box密钥序列。

        public static string rc4_crypt(string key, string value)
        {
            byte[] box = rc4_init(key);
            char[] buffer = value.ToCharArray();
            for (int i = 0, low = 0, high = 0, mid; i < buffer.Length; i++)
            {
                low = (low + 1) % 255;
                high = (high + box[i % 255]) % 255;


                byte b = box[low];
                box[low] = box[high];
                box[high] = b;


                mid = (box[low] + box[high]) % 255;
                buffer[i] ^= (char)box[mid];
            }
            return new string(buffer);
        }

上面是伪子随机数生成部分,首先调用rc4_init(key)获取到

被随机打烂的密钥序列S-box,然后通过把value转换成buffer

缓冲区,我们按照buffer.Length进行计次循环,首先我们需要

计算伪低位索引 low = (low + 1) % 255; 然后计算伪高位索引

high = (high + box[i % 255]) % 255,到了这里我们开始交换

两者的值,这里为伪随机数生成部分,下面则通过把两者所以

的S-box中的值相加% 255取得伪中间索引,与buffer[i] ^= (ch

ar)box[mid]; 进行异或并赋值 最后在把buffer返回给调用方。

这个算法就基本完成了 如如果我解释的并不是很清楚 你也可以

点开这个链接,http://baike.baidu.com/link?url=PpEcozy2oqUap

zng83HJ3-9jknr_qbg-mIUReRYowP215l-RP4R5qEjw8jn0X67QG

M8mJJlAIuEUhtPQNC4QOa

RC4 应用代码:

        public static void Main(string[] args)
        {
            string enc = rc4_crypt("China", "Japan"); // 加密
            string dec = rc4_crypt("China", enc); // 解密
        }

标签: 代码

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇: js检测浏览器版本方法

下一篇: php实现定时创建指定大小文件脚本