dachaochao1 2015-01-20 07:49 采纳率: 0%
浏览 1749

关于DES加密 求帮助!

对接方des加密 是用.net 写的

我用的是php 就大侠把.net的加密程序帮我 转换成 php的

下面是 .NET 的加密程序:

 public class DESEncryptDecrypt
    {
        private string Key;
        private string IV;
        private DESCryptoServiceProvider IDes;
        private byte[] GetKey;
        private byte[] GetIV;
        public DESEncryptDecrypt()
        {
            this.Key = "%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7&*^$^&*%&*%$@#@^";
            this.IV = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            this.Init();
        }

        public DESEncryptDecrypt(string Key)
        {
            this.Key = Key;
            this.IV = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            this.Init();
        }

        public DESEncryptDecrypt(string Key,string IV)
        {
            this.Key = Key;
            this.IV = IV;
            this.Init();
        }

        private void Init()
        {
            this.IDes = new DESCryptoServiceProvider();
            this.IDes.GenerateKey();
            this.GetKey = this.IDes.Key;
            this.IDes.GenerateIV();
            this.GetIV = this.IDes.IV;
        }

        /// <summary>
        /// 获得密钥
        /// </summary>
        /// <returns>密钥</returns>
        private byte[] GetLegalKey()
        {
            string sTemp = this.Key;

            byte[] bytTemp = this.GetKey;
            int KeyLength = bytTemp.Length;
            if (sTemp.Length > KeyLength)
            {
                sTemp = sTemp.Substring(0, KeyLength);
            }
            else
            {
                if (sTemp.Length < KeyLength)
                {
                    sTemp = sTemp.PadRight(KeyLength, ' ');
                }
            }
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }

        /// <summary>
        /// 获得初始向量IV
        /// </summary>
        /// <returns>初试向量IV</returns>
        private byte[] GetLegalIV()
        {
            string sTemp = this.Key;
            byte[] bytTemp = this.GetIV;
            int IVLength = bytTemp.Length;
            if (sTemp.Length > IVLength)
            {
                sTemp = sTemp.Substring(0, IVLength);
            }
            else
            {
                if (sTemp.Length < IVLength)
                {
                    sTemp = sTemp.PadRight(IVLength, ' ');
                }
            }
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }

        /// <summary>
        /// 加密算法
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public string Encrypt(string data)
        {

            //将要加密的数据编码为字节数组
            byte[] encrypt_data = System.Text.Encoding.UTF8.GetBytes(data);    //如果使用Unicode编码,支持中文加密
            //创建流,保存加密后的数据
            MemoryStream ms = new MemoryStream();
            //创建加密流
            CryptoStream cs = new CryptoStream(ms, this.IDes.CreateEncryptor(this.GetLegalKey(), this.GetLegalIV()), CryptoStreamMode.Write);
            //调用Write方法将加密后的结果写到 流 中
            cs.Write(encrypt_data, 0, encrypt_data.Length);
            //将数据从流写入内存(这句不能少,否则在从内存导出到字符串的时候会出现字符丢失)
            cs.FlushFinalBlock();
            //ms.ToString(); ==>将流写入字节数组中
            string result = Convert.ToBase64String(ms.ToArray());
            ms.Close();
            cs.Close();
            return result;
        }

        /// <summary>
        /// 解密算法
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public string Decrypt(string data)
        {

            byte[] decrypt_data = Convert.FromBase64String(data);

            MemoryStream ms = new MemoryStream();

            CryptoStream cs = new CryptoStream(ms, this.IDes.CreateDecryptor(this.GetLegalKey(), this.GetLegalIV()), CryptoStreamMode.Write);
            cs.Write(decrypt_data, 0, decrypt_data.Length);
            cs.FlushFinalBlock();
            string result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            cs.Close();

            return result;
        }
    }
  • 写回答

2条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题