コード例 #1
0
        /// <summary>
        /// 加密字符串,转换结果为 Base64 编码字符
        /// 加密密匙包含在加密结果中
        ///
        /// 加密结果最短长度为 32
        /// 然后以 12 或者 8 为基数增加为 44,56,64,76 ...
        ///
        /// 原码长度在与加密结果长度
        /// 0 - 7   : 32 位
        /// 8 - 15  : 44 位 = 32 + 12
        /// 16 - 23 : 56 位 = 44 + 12
        /// 24 - 31 : 64 位 = 56 + 8
        /// 32 - 39 : 76 位 = 64 + 8
        /// 40 - 47 : 88 位 = 76 + 12
        /// 48 - 55 : 96 位 = 88 + 8
        /// 56 - 63 : 108 位 = 96 + 12
        /// 64 - 71 : 120 位 = 108 + 12
        /// 72 - 89 : 128 位 = 120 + 8
        /// ......
        ///
        /// 即:原码长度没超过 8 ,密码长度升一个数量级,基数为 12 或者 8
        /// MIME/BASE64 的算法很简单,它将字符流顺序放入一个 24 位的缓冲区,缺
        /// 字符的地方补零。然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位,
        /// 用下面的64个字符重新表示:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。
        /// 如果输入只有一个或两个字节,那么输出将用等号“=”补足。这可以隔断附加的信息造成编码的混乱。
        /// 这就是BASE64。
        /// </summary>
        /// <param name="str"> 字符串 </param>
        /// <returns> 加密的字符串 </returns>
        public static string EncryptString(string str)
        {
            DESCrypto des = new DESCrypto();

            byte[] key    = des.desKey;
            byte[] iv     = des.desIV;
            byte[] en     = des.DESEncrypt(Encoding.ASCII.GetBytes(str));
            byte[] result = new byte[en.Length + 16];

            result[0] = en[0];
            if (result[0] % 2 == 0)
            {
                for (int i = 0; i < 8; i++)
                {
                    result[i + 1] = key[i];
                }
                for (int i = 0; i < 8; i++)
                {
                    result[i + 9] = iv[i];
                }
                for (int i = 1; i < en.Length; i++)
                {
                    result[i + 16] = en[i];
                }
            }
            else
            {
                for (int i = 1; i < en.Length; i++)
                {
                    result[i] = en[i];
                }
                for (int i = 0; i < 8; i++)
                {
                    result[i + en.Length] = key[i];
                }
                for (int i = 0; i < 8; i++)
                {
                    result[i + en.Length + 8] = iv[i];
                }
            }

            return(Convert.ToBase64String(result));
        }
コード例 #2
0
        /// <summary>
        /// 解密字符串
        /// </summary>
        /// <param name="str"> 字符串 </param>
        /// <returns> 解密的字符串 </returns>
        public static string DecryptString(string str)
        {
            byte[] data = Convert.FromBase64String(str);
            byte[] key  = new byte[8];
            byte[] iv   = new byte[8];
            byte[] en   = new byte[data.Length - 16];
            en[0] = data[0];
            if (en[0] % 2 == 0)
            {
                for (int i = 0; i < 8; i++)
                {
                    key[i] = data[i + 1];
                }
                for (int i = 0; i < 8; i++)
                {
                    iv[i] = data[i + 9];
                }
                for (int i = 1; i < en.Length; i++)
                {
                    en[i] = data[i + 16];
                }
            }
            else
            {
                for (int i = 1; i < en.Length; i++)
                {
                    en[i] = data[i];
                }
                for (int i = 0; i < 8; i++)
                {
                    key[i] = data[i + en.Length];
                }
                for (int i = 0; i < 8; i++)
                {
                    iv[i] = data[i + en.Length + 8];
                }
            }

            DESCrypto des = new DESCrypto(key, iv);

            return(Encoding.ASCII.GetString(des.DESDecrypt(en)).TrimEnd(new char[] { '\0' }));
        }