zoukankan      html  css  js  c++  java
  • C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密

    DES加密算法

    des对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法

    这里直接贴代码:

     加密结果为Base64字符串。

    C#版本DES加密方法 :

        /// <summary>
        ///  加密 算法
        ///  参考,C# php 通用加密算法。 Des加密
        ///  http://www.it1352.com/422514.html
        /// </summary>
        public class DESEncrypt
        {
            /// <summary>
            /// 加密
            /// </summary>
            /// <param name="Text"></param>
            /// <returns></returns>
            public static string Encrypt(string Text)
            {
                return Encrypt(Text, "abcd1234");// 这里更新为一个至少8位长度的密码
            }
            public static string Encrypt(string strText, string decryptKey)
            {
                string outString = "";
                string result = string.Empty;
    
                try
                {
                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                    des.Mode = CipherMode.ECB;
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
    
                    des.Key = ASCIIEncoding.ASCII.GetBytes(decryptKey.Substring(0, 8));//8位 偏移向量,一般为8位。
                    des.IV = ASCIIEncoding.ASCII.GetBytes(decryptKey.Substring(0, 8));
    
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    byte[] bytelist = ms.ToArray();
    
                    outString = Convert.ToBase64String(bytelist);// 转base64位输出
                    //StringBuilder ret = new StringBuilder();
                    //foreach (byte b in ms.ToArray())
                    //{
                    //    ret.AppendFormat("{0:X2}", b);
                    //}
                    //return ret.ToString();
    
                }
                catch (System.Exception)
                {
                    outString = "";
                }
                return outString;
            }
    
    
            #region ========解密========
    
    
            /// <summary>
            /// 解密
            /// </summary>
            /// <param name="Text"></param>
            /// <returns></returns>
            public static string Decrypt(string Text)
            {
                return Decrypt(Text, "abcd1234");
            }
    
            /// <summary> 
            /// 解密数据 
            /// </summary> 
            /// <param name="Text"></param> 
            /// <param name="sKey"></param> 
            /// <returns></returns> 
            public static string Decrypt(string Text, string sKey)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                des.Mode = CipherMode.ECB;
                //int len;
                //len = Text.Length / 2;
                //byte[] inputByteArray = new byte[len];
                //int x, i;
                //for (x = 0; x < len; x++)
                //{
                //    i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
                //    inputByteArray[x] = (byte)i;
                //}
                byte[] inputByteArray;
                inputByteArray = Convert.FromBase64String(Text);
    
                des.Key = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8));//8位
                des.IV = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8));
    
                //des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
                //des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                return Encoding.Default.GetString(ms.ToArray());
            } 
    
            #endregion
    
        }
    

      

    PHP版本的des加密代码:

    <?php
    /* * DES加密、解密 * To change this template file, choose Tools | Templates * and open the template in the editor. */ /* 秘钥:abcd1234,des加密ecb模式。 输入: 输出: */ class Des { public static function encrypt($key, $input) { $size = mcrypt_get_block_size('des', 'ecb'); // $size = 8 ; $input = self::pkcs5_pad($input, $size); // // $key = $this->key; $td = mcrypt_module_open('des', '', 'ecb', ''); $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //向量随机 @mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } public static function decrypt($key, $encrypted) { $encrypted = base64_decode($encrypted); // $key =$this->key; $td = mcrypt_module_open('des','','ecb',''); //使用MCRYPT_DES算法,cbc模式 $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); $ks = mcrypt_enc_get_key_size($td); @mcrypt_generic_init($td, $key, $iv); //初始处理 $decrypted = mdecrypt_generic($td, $encrypted); //解密 mcrypt_generic_deinit($td); //结束 mcrypt_module_close($td); $y= self::pkcs5_unpad($decrypted); return $y; } public static function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } public static function pkcs5_unpad($text) { $pad = ord($text{strlen($text)-1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); }
    }


  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/davies/p/10397058.html
Copyright © 2011-2022 走看看