精华内容
下载资源
问答
  • 常用的加密解密方法

    千次阅读 2008-08-29 09:11:00
     #region ========解密========  /// <summary>  /// 解密数据  /// </summary>  /// <param name="Text"></param>  /// <param name="sKey"></param>  /// <returns></returns>  public static ...

    using System;
    using System.Security.Cryptography;
    using System.Text;

    namespace AttendService
    {
        public static class DESEncrypt
        {
            #region ========加密========

            private static string txtKey = "PatrickpanP=";
            private static string txtIV = "LiuJineagel=";

             /// <summary>
            /// 加密数据
            /// </summary>
            /// <param name="Text"></param>
            /// <param name="sKey"></param>
            /// <returns></returns>
            public static string Encrypt(string Text)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray;
                inputByteArray = Encoding.Default.GetBytes(Text);
                //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));
                des.Key = Convert.FromBase64String(txtKey);
                des.IV = Convert.FromBase64String(txtIV);
                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();
                StringBuilder ret = new StringBuilder();
                foreach (byte b in ms.ToArray())
                {
                    ret.AppendFormat("{0:X2}", b);
                }
                return ret.ToString();
            }

            #endregion

            #region ========解密========


            /// <summary>
            /// 解密数据
            /// </summary>
            /// <param name="Text"></param>
            /// <param name="sKey"></param>
            /// <returns></returns>
            public static string Decrypt(string Text)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                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;
                }
                //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));
                des.Key = Convert.FromBase64String(txtKey);
                des.IV = Convert.FromBase64String(txtIV);
                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
        }
    }

    展开全文
  • C#常用的加密解密方法

    万次阅读 2016-06-18 16:52:43
    开篇C#内置很多加密解密的方法,有MD5,SHA1,base64等。这里会简单介绍下这几个方法以及用法,不过不会深入研究每种加密方法的原理,高手请绕行。 这几个加密解密会分为两类说,一类是只有加密,没有解密类型MD5,...

    开篇

    C#内置很多加密解密的方法,有MD5,SHA1,base64等。这里会简单介绍下这几个方法以及用法,不过不会深入研究每种加密方法的原理,高手请绕行。
    这几个加密解密会分为两类说,一类是只有加密,没有解密类型的MD5,SHA1。此类加密常用在数据校验。一类是有加密,有解密类型的base64,DES,RSA。此类加密常用在数据传输。

    数据校验型

    MD5
    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
    p.s.内容来自百度百科。

    MD5主要是用来做数据校验的。拿网上下载软件来说,有很多软件在下载的时候都会提供一个MD5校验码,就是用来校验软件是否被他人修改过。还有就是用户账号系统,用户注册后,数据库存储的不是明文密码,而是MD5码。

    测试代码
    演示如何获取一个字符串的MD5 hash以及校验MD5 hash。

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace MD5Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string source = "Happy Birthday!";
    
                string hash = GetMd5Hash(source);
                Console.WriteLine("The MD5 hash of " + source + " is: " + hash);
    
                Console.WriteLine("Verifying the hash ...");
    
                if (VerifyMd5Hash(source, hash))
                {
                    Console.WriteLine("The hashes are the same.");
                }
                else
                {
                    Console.WriteLine("The hashes are not same.");
                }
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// 获取一个字符串的32位16进制字符串格式MD5码
            /// </summary>
            /// <param name="input">原字符串</param>
            /// <returns></returns>
            static string GetMd5Hash(string input)
            {
                MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
    
                byte[] inputBytes = Encoding.Default.GetBytes(input);
    
                byte[] data = md5Hasher.ComputeHash(inputBytes);
    
                StringBuilder sBuilder = new StringBuilder();
    
                //将data中的每个字符都转换为16进制的
                for (int i = 0; i < data.Length; i++)
                {
                    sBuilder.Append(data[i].ToString("x2"));
                }
    
                return sBuilder.ToString();
            }
    
            /// <summary>
            /// 验证Md5 hash
            /// </summary>
            /// <param name="input">原字符串</param>
            /// <param name="hash">原字符串的md5码</param>
            /// <returns></returns>
            static bool VerifyMd5Hash(string input, string hash)
            {
                string hashOfInput = GetMd5Hash(input);
    
                StringComparer comparer = StringComparer.OrdinalIgnoreCase;
    
                if (0 == comparer.Compare(hashOfInput, hash))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
    

    SHA1
    安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要,(但会有1x10 ^ 48分之一的机率出现相同的消息摘要,一般使用时忽略)。
    p.s.内容摘自百度百科

    sha1和md5的用途类似,用来验证数据。

    测试代码
    演示通过sha1获取一个字符串的hash 并作验证。

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace SHA1Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string source = "Happy Birthday!";
                string hash = GetSha1Hash(source);
                Console.WriteLine("The SHA1 Hash of " + source + " is: " + hash);
    
                Console.WriteLine("Verifying the hash....");
    
                if (VerifySha1Hash(source, hash))
                {
                    Console.WriteLine("The hashes are the same...");
                }
                else
                {
                    Console.WriteLine("The Hashes are not same...");
                }
                Console.ReadKey();
            }
    
            static string GetSha1Hash(string input)
            {
                byte[] inputBytes = Encoding.Default.GetBytes(input);
    
                SHA1 sha = new SHA1CryptoServiceProvider();
    
                byte[] result = sha.ComputeHash(inputBytes);
    
                StringBuilder sBuilder = new StringBuilder();
    
                for (int i = 0; i < result.Length; i++)
                {
                    sBuilder.Append(result[i].ToString("x2"));
                }
    
                return sBuilder.ToString();
            }
    
            static bool VerifySha1Hash(string input, string hash)
            {
                string hashOfInput = GetSha1Hash(input);
    
                StringComparer comparer = StringComparer.OrdinalIgnoreCase;
    
                if (0 == comparer.Compare(hashOfInput, hash))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
    

    加密数据传输

    这个类型的加密可以解密,主要用来把加密后的数据进行传输,对方收到数据后进行解密。

    base64
    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到
    p.s.内容摘自百度百科。

    测试代码

    using System;
    using System.Text;
    
    namespace Base64Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string source = "Happy Birthday!";
                string encryStr = EncryptBase64(source);
    
                Console.WriteLine("原数据:" + source);
    
                Console.WriteLine("加密后的数据:" + encryStr);
    
                string decryStr = DecryptBase64(encryStr);
    
                Console.WriteLine("解密后的数据:" + decryStr);
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// base64加密
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            static string EncryptBase64(string input)
            {
                byte[] inputBytes = Encoding.UTF8.GetBytes(input);
    
                return Convert.ToBase64String(inputBytes);
            }
    
            /// <summary>
            /// base64解密
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            static string DecryptBase64(string input)
            {
                byte[] inputBytes = Convert.FromBase64String(input);
    
                return Encoding.UTF8.GetString(inputBytes);
            }
        }
    }
    

    base64的加密解密规则比较固定,所以破解也容易,在网上找个在线base64解密就可以破解加密后的内容,所以敏感数据不推荐使用base64。

    DES
    对称加密算法
    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DSA),已与作为标准的DES区分开来。
    p.s.内容摘自百度百科

    测试代码

    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace DESTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                string key = "The_key!";
    
                string source = "Happy Birthday!";
    
                Console.WriteLine("Source  string: " + source);
    
                string encryptStr = EncryptDES(source, key);
                Console.WriteLine("Encrypt string: " + encryptStr);
    
                string decryptStr = DecryptDES(encryptStr, key);
                Console.WriteLine("Decrypt string: " + decryptStr);
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// 进行DES加密
            /// </summary>
            /// <param name="pToEncrypt">要加密的字符串</param>
            /// <param name="key">密钥,必须为8位</param>
            /// <returns>以Base64格式返回的加密字符串</returns>
            static string EncryptDES(string pToEncrypt, string sKey)
            {
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
                {
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(inputByteArray, 0, inputByteArray.Length);
                        cs.FlushFinalBlock();
                        cs.Close();
                    }
                    string str = Convert.ToBase64String(ms.ToArray());
                    ms.Close();
                    return str;
                }
            }
    
            static string DecryptDES(string pToDecrypt, string sKey)
            {
                byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
                {
                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
                    MemoryStream ms = new MemoryStream();
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(inputByteArray, 0, inputByteArray.Length);
                        cs.FlushFinalBlock();
                        cs.Close();
                    }
                    string str = Encoding.UTF8.GetString(ms.ToArray());
                    ms.Close();
                    return str;
                }
            }
        }
    }
    

    DES加密解密需要提供一个key,双方可以约定一个共同的key使用。

    RSA
    非对称加密算法
    大名鼎鼎的RSA算法 ->_->,此处没有介绍,自行百度,Google。
    只说明,RSA需要两把key,即密钥,一个public key进行加密,一个private key用来解密。也可称为公钥,私钥。
    测试代码
    演示如何生成公钥,私钥,以及使用公钥加密,私钥解密。

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace RSATest
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    UnicodeEncoding byteConverter = new UnicodeEncoding();
    
                    byte[] dataToEncrypt = byteConverter.GetBytes("Happy Birthday!");
                    byte[] encryptedData;
                    byte[] decryptedData;
    
                    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                    {
                        //数据加密 获取public key信息
                        //(using RSACryptoServiceProvider.ExportParameters(false)
                        encryptedData = EncryptRSA(dataToEncrypt, rsa.ExportParameters(false), false);
    
                        //数据解密,获取private key信息
                        //(using RSACryptoServiceProvider.ExportParameters(true))
                        decryptedData = DecryptRSA(encryptedData, rsa.ExportParameters(true), false);
                        Console.WriteLine("Decrypted String: " + byteConverter.GetString(decryptedData));
                    }
    
                    Console.ReadKey();
                }
                catch (ArgumentNullException)
                {
                   Console.WriteLine("Encryption failed!");
                }
            }
    
            /// <summary>
            /// 加密数据
            /// </summary>
            /// <param name="dataToEncrypt">要加密的byte数组</param>
            /// <param name="rsaKeyInfo"></param>
            /// <param name="doOAEPadding"></param>
            /// <returns></returns>
            static byte[] EncryptRSA(byte[] dataToEncrypt, RSAParameters rsaKeyInfo, bool doOAEPadding)
            {
                try
                {
                    byte[] encryptedData;
    
                    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                    {
                        //导入RSA key信息,这里导入公钥信息
                        rsa.ImportParameters(rsaKeyInfo);
    
                        //加密传入的byte数组,并指定OAEP padding
                        //OAEP padding只可用在微软Window xp及以后的系统中
                        encryptedData = rsa.Encrypt(dataToEncrypt, doOAEPadding);
                    }
    
                    return encryptedData;
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                    return null;
                }
            }
    
            /// <summary>
            /// 解密数据
            /// </summary>
            /// <param name="dataToDecrypt"></param>
            /// <param name="rsaKeyInfo"></param>
            /// <param name="doOAEPPadding"></param>
            /// <returns></returns>
            static byte[] DecryptRSA(byte[] dataToDecrypt, RSAParameters rsaKeyInfo, bool doOAEPPadding)
            {
                try
                {
                    byte[] decryptedData;
    
                    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                    {
                        rsa.ImportParameters(rsaKeyInfo);
    
                        decryptedData = rsa.Decrypt(dataToDecrypt, doOAEPPadding);
                    }
    
                    return decryptedData;
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                    return null;
                }
            }
        }
    }
    

    网上他人写的使用xml形式的密钥加密解密

    –生成xml格式的密钥
    生成的密钥会以xml的格式放在你工程bin\Debug目录下。

            /// <summary>
            /// 生成RSA public key private key
            /// </summary>
            public static void GenerateRSAKey()
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                using (StreamWriter writer = new StreamWriter("Privatekey.xml"))
                {
                    writer.WriteLine(rsa.ToXmlString(true));
                }
    
                using (StreamWriter writer = new StreamWriter("PublicKey.xml"))
                {
                     writer.WriteLine(rsa.ToXmlString(false));
                }
            }

    –使用xml格式密钥加密解密
    方便测试就直接把public key private key写在代码里了

    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace RSAXmlTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                string source = "Happy Birthday!";
                string encryptedStr = EncryptRSA("", source);
                Console.WriteLine("Encrypted String: = " + encryptedStr);
                string decryptedStr = DecryptRSA("", encryptedStr);
                Console.WriteLine("Decrypted String: = " + decryptedStr);
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// 生成RSA public key private key
            /// </summary>
            public static void GenerateRSAKey()
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                using (StreamWriter writer = new StreamWriter("Privatekey.xml"))
                {
                    writer.WriteLine(rsa.ToXmlString(true));
                }
    
                using (StreamWriter writer = new StreamWriter("PublicKey.xml"))
                {
                    writer.WriteLine(rsa.ToXmlString(false));
                }
            }
    
            /// <summary>
            /// RSA Encrypt
            /// </summary>
            /// <param name="publickey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string EncryptRSA(string publickey, string content)
            {
                publickey = @"<RSAKeyValue><Modulus>pHfhtj8f/50PMyRq1MjcmbOSvrIIXRihzLTmr
    ZKyo3o9ID6XEc5p4Tyjz9fbwYc8asfAF4GYJ3C/hPLvMST9M9WMKnT+sEsItG6jSVTSM0N580ORIusJRsoVBB
    gqczr0hNvaGmDxOvGeomqF1P/8tNQzY8L3a/szdrOSa0v6kW0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
    
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(publickey);
                var cipherBytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
    
                return Convert.ToBase64String(cipherBytes);
    
            }
    
            public static string DecryptRSA(string privatekey, string content)
            {
                privatekey = @"<RSAKeyValue><Modulus>pHfhtj8f/50PMyRq1MjcmbOSvrIIXRihzLTmrZKyo3o9ID6XEc5p4Tyjz9fb
    wYc8asfAF4GYJ3C/hPLvMST9M9WMKnT+sEsItG6jSVTSM0N580ORIusJRsoVBBgqczr0hNvaGmDxOvGeomqF1P/8tNQzY8L3a/szdrOSa0v6k
    W0=</Modulus><Exponent>AQAB</Exponent><P>yDpRsxc+bee57XNa6mb3it9rkmqdWMn5H/8Q0Ql2/quFwPhU6DFxSAx02ueijLkAN4qN
    31ggxLi0fFMYmqKFqw==</P><Q>0kem35FBODvc83JpxeksQ0BJ4x/qV1FPZnEeTuP9ckEjv5+WeKVnWv3Phx/WDDEC+N6pYX+NZYYOiTjjL+
    l9Rw==</Q><DP>g0Z5OkoLDFPZeu0etoA73DkPdjegYg5J38iDZgomkmIyl4o5YOLJussv8jXcRRcmJUQaMEy/bzsKWljA0OGtcQ==</DP><DQ>OQQoo
    TIXhxHkRTZeq8UftVR3NFhxCCAJ8XL2jtmO3S4AbXLuL+RZc/iiDrd5KHEZpzVopAEb680/n8GHCHS8/Q==</DQ><InverseQ>H0C+3yD6o+hBz
    4BrMe/e5cxrIXMe+zOEHdQ/wgwswdZz8YHLe3Y9maOcyWPMKNCKkFIaMQ4D6zaNh7h8JQyFDQ==</InverseQ><D>ChGdmH1K2M8Yh1M01Ljeg7
    mYduMKKHDoNVKwRwx5GHfUvPmeYNexm1MNqen9wsS9vSfKqcwkSlELvviEdKf4D3z8n2TLTaHhHCsTFC2VTM75ar+g0rYL34ofa25hhZOzlKLrB
    vRk3FBFPKO2ekyEVEQojdfPJUOUOr/UfKHm6J0=</D></RSAKeyValue>";
    
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(privatekey);
                var cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
    
                return Encoding.UTF8.GetString(cipherbytes);
            }
        }
    }
    
    展开全文
  • 项目中有时我们需要使用PHP将特定信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后字符串可以通过解密算法进行解密,便于程序对解密信息进行处理。最常见应用在用户登录以及一些API数据...

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。最常见的应用在用户登录以及一些API数据交换的场景。最常见的应用在用户登录以及一些API数据交换的场景。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。
    ①第一种加密解密算法

    <?php  
        function encryptDecrypt($key, $string, $decrypt){   
            if($decrypt){   
                $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");   
                return $decrypted;   
            }else{   
                $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));   
                return $encrypted;   
            }   
        }   
          
        //加密:"z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk="  
        echo encryptDecrypt('password', 'Helloweba欢迎您',0);   
        //解密:"Helloweba欢迎您"  
        echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1);  
    ?>  
    

    ②第二种加密解密算法:

    <?php  
    //加密函数  
    <?php  
      
    //改进后的算法  
    //加密函数  
    function lock_url($txt,$key='zhuoyuexiazai'){  
        $txt = $txt.$key;  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $nh = rand(0,64);  
        $ch = $chars[$nh];  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = base64_encode($txt);  
        $tmp = '';  
        $i=0;$j=0;$k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;  
            $tmp .= $chars[$j];  
        }  
        return urlencode(base64_encode($ch.$tmp));  
    }  
    //解密函数  
    function unlock_url($txt,$key='zhuoyuexiazai'){  
        $txt = base64_decode(urldecode($txt));  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $ch = $txt[0];  
        $nh = strpos($chars,$ch);  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = substr($txt,1);  
        $tmp = '';  
        $i=0;$j=0; $k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);  
            while ($j<0) $j+=64;  
            $tmp .= $chars[$j];  
        }  
        return trim(base64_decode($tmp),$key);  
    }  
      
    ?> 
    

    ③第三种加密解密算法::discuz中使用的加密解密算法

        <?php  
        //非常给力的authcode加密函数,Discuz!经典代码(带详解)  
        //函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operationDECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。  
        function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {     
            // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙     
            $ckey_length = 4;     
                 
            // 密匙     
            $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);     
                 
            // 密匙a会参与加解密     
            $keya = md5(substr($key, 0, 16));     
            // 密匙b会用来做数据完整性验证     
            $keyb = md5(substr($key, 16, 16));     
            // 密匙c用于变化生成的密文     
            $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';     
            // 参与运算的密匙     
            $cryptkey = $keya.md5($keya.$keyc);     
            $key_length = strlen($cryptkey);     
            // 明文,前10位用来保存时间戳,解密时验证数据有效性,1026位用来保存$keyb(密匙b)//解密时会通过这个密匙验证数据完整性     
            // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确     
            $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :  sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;     
            $string_length = strlen($string);     
            $result = '';     
            $box = range(0, 255);     
            $rndkey = array();     
            // 产生密匙簿     
            for($i = 0; $i <= 255; $i++) {     
                $rndkey[$i] = ord($cryptkey[$i % $key_length]);     
            }     
            // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度     
            for($j = $i = 0; $i < 256; $i++) {     
                $j = ($j + $box[$i] + $rndkey[$i]) % 256;     
                $tmp = $box[$i];     
                $box[$i] = $box[$j];     
                $box[$j] = $tmp;     
            }     
            // 核心加解密部分     
            for($a = $j = $i = 0; $i < $string_length; $i++) {     
                $a = ($a + 1) % 256;     
                $j = ($j + $box[$a]) % 256;     
                $tmp = $box[$a];     
                $box[$a] = $box[$j];     
                $box[$j] = $tmp;     
                // 从密匙簿得出密匙进行异或,再转成字符     
                $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));     
            }     
            if($operation == 'DECODE') {    
                // 验证数据有效性,请看未加密明文的格式     
                if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&  substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {     
                    return substr($result, 26);     
                } else {     
                    return '';     
                }     
            } else {     
                // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因     
                // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码     
                return $keyc.str_replace('=', '', base64_encode($result));     
            }     
        }   
          
        $str = 'abcdef';   
        $key = 'www.helloweba.com';   
        echo authcode($str,'ENCODE',$key,0); //加密   
        $str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';   
        echo authcode($str,'DECODE',$key,0); //解密   
          
        ?>  
    

    原文链接:https://blog.csdn.net/maguang_it/article/details/80087943

    展开全文
  • 相信很多人在开发过程中经常会遇到需要对一些重要信息进行加密处理,今天给大家分享我个人总结一些加密算法: 常见加密方式分为可逆和不可逆两种方式  可逆:RSA,AES,DES等  不可逆:常见MD5,SHAD等 一、...
  • php常用的加密解密方法

    千次阅读 2019-05-27 15:40:38
    1、php 自带加密函数: 1-1、不可逆加密函数为:md5()、crypt();...这是单向加密函数,无法解密。欲比对字符串,将已加密字符串头二个字符放在 salt 参数中,再比对加密后字符串。语法为:string cr...

    1、php 自带的加密函数:

    1-1、不可逆的加密函数为:md5()、crypt();

    md5() 用来计算 MD5 哈稀。语法为:string md5(string str);

    crypt() 将字符串用 UNIX 的标准加密 DES 模块加密。这是单向的加密函数,无法解密。欲比对字符串,将已加密的字符串的头二个字符放在 salt 的参数中,再比对加密后的字符串。语法为:string crypt(string str, string [salt]); 

    1-2、可逆转的加密为:base64_encode()、urlencode() 相对应的解密函数:base64_decode() 、urldecode() 

    base64_encode() 将字符串以 MIME BASE64 编码。此编码方式可以让中文字或者图片也能在网络上顺利传输。语法为string base64_encode(string data); 它的解密函数为:string base64_decode(string encoded_data); 将复回原样。

    urlencode() 将字符串以 URL 编码。例如空格就会变成加号。语法为:string urlencode(string str); 

    它的解密函数为:string urldecode(string str); 将复回原样

    2、自定义加密解密方法:

    2-1、

    function encryptDecrypt($key, $string, $decrypt){   
        if($decrypt){   
            $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");   
            return $decrypted;   
        }else{   
            $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));   
            return $encrypted;   
        }   
    }   

    加密:echo encryptDecrypt('password', 'Helloweba欢迎您',0); 

    解密:echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1);  

    2-2、

    加密:

    function lock_url($txt,$key='www.zhuoyuexiazai.com'){  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $nh = rand(0,64);  
        $ch = $chars[$nh];  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = base64_encode($txt);  
        $tmp = '';  
        $i=0;$j=0;$k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;  
            $tmp .= $chars[$j];  
        }  
        return urlencode($ch.$tmp);  
    }  

    解密:

    function unlock_url($txt,$key='www.zhuoyuexiazai.com'){  
        $txt = urldecode($txt);  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $ch = $txt[0];  
        $nh = strpos($chars,$ch);  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = substr($txt,1);  
        $tmp = '';  
        $i=0;$j=0; $k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);  
            while ($j<0) $j+=64;  
            $tmp .= $chars[$j];  
        }  
        return base64_decode($tmp);  
    }  

    2-3、

    加密:

    function lock_url($txt,$key='zhuoyuexiazai'){  
        $txt = $txt.$key;  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $nh = rand(0,64);  
        $ch = $chars[$nh];  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = base64_encode($txt);  
        $tmp = '';  
        $i=0;$j=0;$k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;  
            $tmp .= $chars[$j];  
        }  
        return urlencode(base64_encode($ch.$tmp));  
    }  

    解密:

    function unlock_url($txt,$key='zhuoyuexiazai'){  
        $txt = base64_decode(urldecode($txt));  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $ch = $txt[0];  
        $nh = strpos($chars,$ch);  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = substr($txt,1);  
        $tmp = '';  
        $i=0;$j=0; $k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);  
            while ($j<0) $j+=64;  
            $tmp .= $chars[$j];  
        }  
        return trim(base64_decode($tmp),$key);  
    }  

    2-4、

    加密:

    function passport_encrypt($txt, $key = 'www.zhuoyuexiazai.com') {   
        srand((double)microtime() * 1000000);   
        $encrypt_key = md5(rand(0, 32000));   
        $ctr = 0;   
        $tmp = '';   
        for($i = 0;$i < strlen($txt); $i++) {   
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;   
        $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);   
        }   
        return urlencode(base64_encode(passport_key($tmp, $key)));   
    }   

    解密:

    function passport_decrypt($txt, $key = 'www.zhuoyuexiazai.com') {   
        $txt = passport_key(base64_decode(urldecode($txt)), $key);   
        $tmp = '';   
        for($i = 0;$i < strlen($txt); $i++) {   
        $md5 = $txt[$i];   
        $tmp .= $txt[++$i] ^ $md5;   
        }   
        return $tmp;   
    }   
    function passport_key($txt, $encrypt_key) {   
        $encrypt_key = md5($encrypt_key);   
        $ctr = 0;   
        $tmp = '';   
        for($i = 0; $i < strlen($txt); $i++) {   
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;   
        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];   
        }   
        return $tmp;   
    } 

    案例:

    $txt = "1";   
    $key = "testkey";   
    $encrypt = passport_encrypt($txt,$key);   
    $decrypt = passport_decrypt($encrypt,$key);   
    echo $encrypt."<br>";   
    echo $decrypt."<br>";

    2-5、

    //非常给力的authcode加密函数,Discuz!经典代码(带详解)  
    //函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。  
    function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {     
        // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙     
        $ckey_length = 4;     
        // 密匙     
        $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);     
        // 密匙a会参与加解密     
        $keya = md5(substr($key, 0, 16));     
        // 密匙b会用来做数据完整性验证     
        $keyb = md5(substr($key, 16, 16));     
        // 密匙c用于变化生成的密文     
        $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';     
        // 参与运算的密匙     
        $cryptkey = $keya.md5($keya.$keyc);     
        $key_length = strlen($cryptkey);     
        // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),   
        //解密时会通过这个密匙验证数据完整性     
        // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确     
        $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :  sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;     
        $string_length = strlen($string);     
        $result = '';     
        $box = range(0, 255);     
        $rndkey = array();     
        // 产生密匙簿     
        for($i = 0; $i <= 255; $i++) {     
            $rndkey[$i] = ord($cryptkey[$i % $key_length]);     
        }     
        // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度     
        for($j = $i = 0; $i < 256; $i++) {     
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;     
            $tmp = $box[$i];     
            $box[$i] = $box[$j];     
            $box[$j] = $tmp;     
        }     
        // 核心加解密部分     
        for($a = $j = $i = 0; $i < $string_length; $i++) {     
            $a = ($a + 1) % 256;     
            $j = ($j + $box[$a]) % 256;     
            $tmp = $box[$a];     
            $box[$a] = $box[$j];     
            $box[$j] = $tmp;     
            // 从密匙簿得出密匙进行异或,再转成字符     
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));     
        }     
        if($operation == 'DECODE') {    
            // 验证数据有效性,请看未加密明文的格式     
            if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&  substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {     
                return substr($result, 26);     
            } else {     
                return '';     
            }     
        } else {     
            // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因     
            // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码     
            return $keyc.str_replace('=', '', base64_encode($result));     
        }     
    }   
    $str = 'abcdef';   
    $key = 'www.helloweba.com';   
    echo authcode($str,'ENCODE',$key,0); //加密   
    $str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';   
    echo authcode($str,'DECODE',$key,0); //解密 

    2-6、

    //函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。  
    function encrypt($string,$operation,$key=''){   
        $key=md5($key);   
        $key_length=strlen($key);   
          $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;   
        $string_length=strlen($string);   
        $rndkey=$box=array();   
        $result='';   
        for($i=0;$i<=255;$i++){   
               $rndkey[$i]=ord($key[$i%$key_length]);   
            $box[$i]=$i;   
        }   
        for($j=$i=0;$i<256;$i++){   
            $j=($j+$box[$i]+$rndkey[$i])%256;   
            $tmp=$box[$i];   
            $box[$i]=$box[$j];   
            $box[$j]=$tmp;   
        }   
        for($a=$j=$i=0;$i<$string_length;$i++){   
            $a=($a+1)%256;   
            $j=($j+$box[$a])%256;   
            $tmp=$box[$a];   
            $box[$a]=$box[$j];   
            $box[$j]=$tmp;   
            $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));   
        }   
        if($operation=='D'){   
            if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){   
                return substr($result,8);   
            }else{   
                return'';   
            }   
        }else{   
            return str_replace('=','',base64_encode($result));   
        }   
    }   
    $str = 'abc';   
    $key = 'www.helloweba.com';   
    $token = encrypt($str, 'E', $key);   
    echo '加密:'.encrypt($str, 'E', $key);   
    echo '解密:'.encrypt($str, 'D', $key);  

     

    展开全文
  • php加密解密:php加密和解密函数通常可以用来加密一些有用字符串存放在数据库里或作为各个子系统间同步登陆令牌,并且通过解密算法解密字符串,该函数使用了base64和MD5加密和解密。 ①第一种加密解密算法 <?...
  • java常用的加密解密方法

    千次阅读 2018-12-19 23:13:20
    该过程逆过程为解密,即将该编码信息转化为其原来数据过程。大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密。 一、双向加密&nbsp; (一)、对称加密&nbsp; ...
  • php中文网最新课程每日17点准时技术干货分享php加密解密:php加密和解密函数通常可以用来加密一些有用字符串存放在数据库里或作为各个子系统间同步登陆令牌,并且通过解密算法解密字符串,该函数使用了base64和MD...
  • php中文网最新课程每日17点准时技术干货分享php加密解密:php加密和解密函数通常可以用来加密一些有用字符串存放在数据库里或作为各个子系统间同步登陆令牌,并且通过解密算法解密字符串,该函数使用了base64和MD...
  • C#开发中常用加密解密方法解析   一、MD5加密算法 我想这是大家都常听过算法,可能也用比较多。那么什么是MD5算法呢?MD5全称是message-digest algorithm 5,简单说就是单向加密,即是说无法根据密文推导...
  • 相信很多人在开发过程中经常会遇到需要对一些重要信息进行加密处理,今天给大家分享我个人总结一些加密算法: 常见加密方式分为可逆和不可逆两种方式 可逆:RSA,AES,DES等 不可逆:常见MD5,SHAD等 一、...
  •  #region ========解密========  /// <summary>  /// 解密数据  /// </summary>  /// <param name="Text"></param>  /// <param name="sKey"></param>  /// <returns></returns>  public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 811
精华内容 324
热门标签
关键字:

常用的加解密方法