zoukankan      html  css  js  c++  java
  • 一般加密解密算法 kiddy

    View Code
    public class NmSecurity
        {
            /**************************************************
                * FileName: NmSecurity.cs
                * Version: 1.00
                * Author: Kria 
                * Date: 2009-3-4
                * Last Modified Date: 2009-3-6
                * Function: 
                * CopyRight (c) Netmarch Company 2000-2003
                *            All rights reserved
            **************************************************/
    
            private static string encodingType = ConfigurationManager.AppSettings["EncryptStringEncoding"];
            
            //------------------------------------加密部分开始----------------------------------------------------
            /// <summary>
            /// 使用MD5加密方法加密数据
            /// </summary>
            /// <param name="sourceData">用户密码等需要被MD5加密的源数据</param>
            /// <returns>MD5加密后的形成字符串</returns>
            public static string Md5(string sourceData)
            {
                return FormsAuthentication.HashPasswordForStoringInConfigFile(sourceData, "MD5");
            }
    
            /// <summary>
            /// 返回二进制数组的Hash值
            /// </summary>
            /// <param name="sourceData">二进制数组</param>
            /// <returns>产生的Hash值</returns>
            public static string Hash(byte[] sourceData)
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                return BitConverter.ToString(md5.ComputeHash(sourceData)).Replace("-", "").ToLower();
            }
    
            /// <summary>
            /// 获取随机对称加密密钥
            /// </summary>
            /// <returns>密钥字符串</returns>
            public static string GenericSymmetricKey()
            {
                SymmetricAlgorithm sa = Rijndael.Create();
                sa.GenerateKey();
                return Convert.ToBase64String(sa.Key);
            }
    
    
            /// <summary>
            /// 获取随机非对称加密密钥
            /// </summary>
            /// <returns>密钥字符串</returns>
            public static string GenericAsymmetricKey()
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                return Convert.ToBase64String(rsa.ExportCspBlob(true));
            }
    
            /// <summary>
            /// 从带私钥的密钥中获取只包含公钥的密钥
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static string GetPublicKey(string key)
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.ImportCspBlob(Convert.FromBase64String(key));
                return Convert.ToBase64String(rsa.ExportCspBlob(false));
    
            }
    
            /// <summary>
            /// 二进制流对二进制流的对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的源数据</param>
            /// <param name="key">16位或24位密钥,或者使用GenericSymmetricKey方法产生随机对称密钥</param>
            /// <returns>加密后的二进制流形式的字节数组</returns>
            public static byte[] SymmetricEncryptBinaryToBinary(byte[] sourceData, string key)
            {
                try
                {
                    SymmetricAlgorithm sa = Rijndael.Create();
                    sa.Mode = CipherMode.ECB;
                    sa.Padding = PaddingMode.Zeros;
                    try
                    {
                        sa.Key = Convert.FromBase64String(key);
                    }
                    catch
                    {
                        sa.Key = Encoding.GetEncoding(encodingType).GetBytes(key);
                    }
                    MemoryStream ms = new MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write);
                    cs.Write(sourceData, 0, sourceData.Length);
                    cs.Close();
                    byte[] encryptBinaryData = ms.ToArray();
                    ms.Close();
                    return encryptBinaryData;
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
            /// <summary>
            /// 二进制流对字符串的对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的源数据</param>
            /// <param name="key">16位或24位密钥,或者使用GenericSymmetricKey方法产生随机对称密钥</param>
            /// <returns>加密后的形成的字符串</returns>
            public static string SymmetricEncryptBinaryToString(byte[] sourceData, string key)
            {
                byte[] encryptBinaryData = SymmetricEncryptBinaryToBinary(sourceData, key);
                return Convert.ToBase64String(encryptBinaryData);
            }
    
            /// <summary>
            /// 字符串对二进制流的对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的源数据</param>
            /// <param name="key">16位或24位密钥,或者使用GenericSymmetricKey方法产生随机对称密钥</param>
            /// <returns>加密后的二进制流形式的字节数组</returns>
            public static byte[] SymmetricEncryptStringToBinary(string sourceData, string key)
            {
                    byte[] byteData = Encoding.GetEncoding(encodingType).GetBytes(sourceData);
                    return SymmetricEncryptBinaryToBinary(byteData, key);
            }
    
            /// <summary>
            /// 字符串对字符串的对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的字符串</param>
            /// <param name="key">16位或24位密钥,或者使用GenericSymmetricKey方法产生随机对称密钥</param>
            /// <returns>加密后形成的字符串</returns>
            public static string SymmetricEncryptStringToString(string sourceData, string key)
            {
                try
                {
                    byte[] byteData = Encoding.GetEncoding(encodingType).GetBytes(sourceData);
                    byte[] encryptBinaryData = SymmetricEncryptBinaryToBinary(byteData, key);
                    return Convert.ToBase64String(encryptBinaryData);
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
    
    
            /// <summary>
            /// 二进制流对二进制流的非对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的源数据</param>
            /// <param name="key">RSA密钥或者使用GenericAsymmetricKey方法产生随机非对称密钥</param>
            /// <returns>加密后的二进制流形式的字节数组</returns>
            public static byte[] AsymmetricEncryptBinaryToBinary(byte[] sourceData, string key)
            {
                try
                {
                    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                    rsa.ImportCspBlob(Convert.FromBase64String(key));
                    byte[] byteEncrypt = rsa.Encrypt(sourceData, false);
                    return byteEncrypt;
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
            /// <summary>
            /// 二进制流对字符串的非对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的源数据</param>
            /// <param name="key">RSA密钥或者使用GenericAsymmetricKey方法产生随机非对称密钥</param>
            /// <returns>加密后的形成的字符串</returns>
            public static string AsymmetricEncryptBinaryToString(byte[] sourceData, string key)
            {
    
                byte[] byteEncrypt = AsymmetricEncryptBinaryToBinary(sourceData, key);
                return Convert.ToBase64String(byteEncrypt);
            }
    
            /// <summary>
            /// 字符串对二进制流的非对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的字符串</param>
            /// <param name="key">RSA密钥或者使用GenericAsymmetricKey方法产生随机非对称密钥</param>
            /// <returns>加密后的二进制流形式的字节数组</returns>
            public static byte[] AsymmetricEncryptStringToBinary(string sourceData, string key)
            {
    
                byte[] byteData = Encoding.GetEncoding(encodingType).GetBytes(sourceData);
                byte[] byteEncrypt = AsymmetricEncryptBinaryToBinary(byteData, key);
                return byteEncrypt;
            }
    
            /// <summary>
            /// 字符串对字符串的非对称加密
            /// </summary>
            /// <param name="sourceData">需要加密的字符串</param>
            /// <param name="key">RSA密钥或者使用GenericAsymmetricKey方法产生随机非对称密钥</param>
            /// <returns>加密后的二进制流形式的字节数组</returns>
            public static string AsymmetricEncryptStringToString(string sourceData, string key)
            {
    
                byte[] byteData = Encoding.GetEncoding(encodingType).GetBytes(sourceData);
                byte[] byteEncrypt = AsymmetricEncryptBinaryToBinary(byteData, key);
                return Convert.ToBase64String(byteEncrypt);
    
            }
    
            //--------------------------------------加密部分结束-----------------------------------------------------------
            //--------------------------------------解密部分开始-----------------------------------------------------------
    
            /// <summary>
            /// 二进制流对二进制流的对称解密
            /// </summary>
            /// <param name="sourceData">加密后的二进制流</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>解密后的二进制流</returns>
            public static byte[] SymmetricDecryptBinaryToBinary(byte[] sourceData, string key)
            {
                try
                {
                    SymmetricAlgorithm sa = Rijndael.Create();
                    sa.Mode = CipherMode.ECB;
                    sa.Padding = PaddingMode.Zeros;
                    try
                    {
                        sa.Key = Convert.FromBase64String(key);
                    }
                    catch
                    {
                        sa.Key = Encoding.GetEncoding(encodingType).GetBytes(key);
                    }
                    MemoryStream ms = new MemoryStream(sourceData);
                    CryptoStream cs = new CryptoStream(ms, sa.CreateDecryptor(), CryptoStreamMode.Read);
                    byte[] decryptBinaryData = new byte[sourceData.Length];
                    cs.Read(decryptBinaryData, 0, sourceData.Length);
                    int lastIndex = decryptBinaryData.Length;
                    while (lastIndex > 0 && decryptBinaryData[lastIndex - 1] == (byte)0)
                    {
                        lastIndex--;
                    }
                    byte[] subDecryptData = new byte[lastIndex];
                    System.Array.Copy(decryptBinaryData, subDecryptData, lastIndex);
                    return subDecryptData;
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
            /// <summary>
            /// 二进制流对字符串的对称解密
            /// </summary>
            /// <param name="sourceData">加密后的二进制流</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>经过解密后的字符串</returns>
            public static string SymmetricDecryptBinaryToString(byte[] sourceData, string key)
            {
                byte[] decryptBinaryData=SymmetricDecryptBinaryToBinary(sourceData, key);
                string decryptData = Encoding.GetEncoding(encodingType).GetString(decryptBinaryData);
                return decryptData;
            }
    
            /// <summary>
            /// 字符串对二进制流的对称解密
            /// </summary>
            /// <param name="sourceData">加密后的字符串</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>经过解密后的二进制流</returns>
            public static byte[] SymmetricDecryptStringToBinary(string sourceData, string key)
            {
                byte[] encryptBinaryData = Convert.FromBase64String(sourceData);
                byte[] decryptBinaryData = SymmetricDecryptBinaryToBinary(encryptBinaryData, key);
                return decryptBinaryData;
            }
    
            /// <summary>
            /// 字符串对字符串的对称解密
            /// </summary>
            /// <param name="sourceData">加密后的字符串</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>经过解密后的字符串</returns>
            public static string SymmetricDecryptStringToString(string sourceData, string key)
            {
                byte[] encryptBinaryData = Convert.FromBase64String(sourceData);
                byte[] decryptBinaryData = SymmetricDecryptBinaryToBinary(encryptBinaryData, key);
                string decryptData = Encoding.GetEncoding(encodingType).GetString(decryptBinaryData);
                return decryptData;
            }
    
            /// <summary>
            /// 二进制流对二进制流的非对称解密
            /// </summary>
            /// <param name="sourceData">加密后的二进制流</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>解密后的二进制流</returns>
            public static byte[] AsymmetricDecryptBinaryToBinary(byte[] sourceData, string key)
            {
                try
                {
                    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                    rsa.ImportCspBlob(Convert.FromBase64String(key));
                    byte[] byteDecrypt = rsa.Decrypt(sourceData, false);
                    return byteDecrypt;
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
            /// <summary>
            /// 二进制流对字符串的非对称解密
            /// </summary>
            /// <param name="sourceData">加密后的二进制流</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>经过解密后的字符串</returns>
            public static string AsymmetricDecryptBinaryToString(byte[] sourceData, string key)
            {
                byte[] byteDecrypt = AsymmetricDecryptBinaryToBinary(sourceData, key);
                return Encoding.GetEncoding(encodingType).GetString(byteDecrypt);
            }
    
            /// <summary>
            /// 字符串对而二进制流的非对称解密
            /// </summary>
            /// <param name="sourceData">加密后的字符串</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>解密后的二进制流</returns>
            public static byte[] AsymmetricDecryptStringToBinary(string sourceData, string key)
            {
                byte[] byteData = Convert.FromBase64String(sourceData);
                byte[] byteDecrypt = AsymmetricDecryptBinaryToBinary(byteData, key);
                return byteDecrypt;
            }
    
            /// <summary>
            /// 字符串对字符串的非对称解密
            /// </summary>
            /// <param name="sourceData">加密后的字符串</param>
            /// <param name="key">对应加密的密钥</param>
            /// <returns>经过解密后的字符串</returns>
            public static string AsymmetricDecryptStringToString(string sourceData, string key)
            {
                byte[] byteData = Convert.FromBase64String(sourceData);
                byte[] byteDecrypt = AsymmetricDecryptBinaryToBinary(byteData, key);
                return Encoding.GetEncoding(encodingType).GetString(byteDecrypt);
            }
    
            //----------------------------------------------带签名验证的加密解密---------------------------------------------
    
            /// <summary>
            /// 二进制流对字符串的带签名的验证加密
            /// </summary>
            /// <param name="sourceData">需要加密的二进制流源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>加密后的数据字符串</returns>
            public static string SignatureEncryptBinaryToString(byte[] sourceData, string localKey, string remoteKey)
            {
                try
                {
                    RSACryptoServiceProvider rsaLocal = new RSACryptoServiceProvider();
                    RSACryptoServiceProvider rsaRemote = new RSACryptoServiceProvider();
                    rsaLocal.ImportCspBlob(Convert.FromBase64String(localKey));
                    rsaRemote.ImportCspBlob(Convert.FromBase64String(remoteKey));
                    SymmetricAlgorithm sa = Rijndael.Create();
                    sa.GenerateIV();
                    //将对称密钥使用非对称加密算法加密并转换成base64
                    string saKey = Convert.ToBase64String(rsaRemote.Encrypt(sa.Key, false));
                    //用默认密钥进行对称加密
                    sa.Mode = CipherMode.ECB;
                    sa.Padding = PaddingMode.Zeros;
                    MemoryStream ms = new MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write);
                    cs.Write(sourceData, 0, sourceData.Length);
                    cs.Close();
                    byte[] encryptBinaryData = ms.ToArray();
                    ms.Close();
                    string encryptData = Convert.ToBase64String(encryptBinaryData);
                    //签名
                    string sinagture = Convert.ToBase64String(rsaLocal.SignData(encryptBinaryData, new SHA1CryptoServiceProvider()));
                    //返回结果:密文+密钥+签名
                    return encryptData + "," + saKey + "," + sinagture;
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
            /// <summary>
            /// 二进制流对二进制流的带签名的验证加密
            /// </summary>
            /// <param name="sourceData">需要加密的二进制流源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>加密后的二进制流数据</returns>
            public static byte[] SignatureEncryptBinaryToBinary(byte[] sourceData, string localKey, string remoteKey)
            {
                string encryptResult = SignatureEncryptBinaryToString(sourceData, localKey, remoteKey);
                return Encoding.GetEncoding(encodingType).GetBytes(encryptResult);
            }
    
            /// <summary>
            /// 字符串对二进制流的带签名的验证加密
            /// </summary>
            /// <param name="sourceData">需要加密的字符串源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>加密后的二进制流数据</returns>
            public static byte[] SignatureEncryptStringToBinary(string sourceData, string localKey, string remoteKey)
            {
                //将要加密的数据转换成二进制数据
                byte[] binaryData = Encoding.GetEncoding(encodingType).GetBytes(sourceData);
                string encryptResult = SignatureEncryptBinaryToString(binaryData, localKey, remoteKey);
                return Encoding.GetEncoding(encodingType).GetBytes(encryptResult);
            }
    
            /// <summary>
            /// 二进制流对字符串的带签名的验证加密
            /// </summary>
            /// <param name="sourceData">需要加密的字符串源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>加密后的字符串数据</returns>
            public static string SignatureEncryptStringToString(string sourceData, string localKey, string remoteKey)
            {
                //将要加密的数据转换成二进制数据
                byte[] binaryData = Encoding.GetEncoding(encodingType).GetBytes(sourceData);
                return SignatureEncryptBinaryToString(binaryData, localKey, remoteKey);
            }
    
            /// <summary>
            /// 字符串对二进制流的带签名的验证解密
            /// </summary>
            /// <param name="sourceData">需要解密的字符串源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>解密后的二进制流数据</returns>
            public static byte[] SignatureDecryptStringToBinary(string sourceData, string localKey, string remoteKey)
            {
                try
                {
                    if (string.IsNullOrEmpty(sourceData))
                    {
                        return null;
                    }
                    string[] dataParts = sourceData.Split(',');
                    if (dataParts.Length != 3)
                    {
                        return null;
                    }
                    string encryptData = dataParts[0];
                    string saKey = dataParts[1];
                    string sinature = dataParts[2];
                    byte[] encryptBinaryData = Convert.FromBase64String(encryptData);
    
                    RSACryptoServiceProvider rsaLocal = new RSACryptoServiceProvider();
                    RSACryptoServiceProvider rsaRemote = new RSACryptoServiceProvider();
                    rsaLocal.ImportCspBlob(Convert.FromBase64String(localKey));
                    rsaRemote.ImportCspBlob(Convert.FromBase64String(remoteKey));
                    SymmetricAlgorithm sa = Rijndael.Create();
                    //验证签名
                    if (!rsaRemote.VerifyData(encryptBinaryData, new SHA1CryptoServiceProvider(), Convert.FromBase64String(sinature)))
                    {
                        throw new Exception("验证签名失败!");
                    }
                    //还原对称加密Key
                    sa.Key = rsaLocal.Decrypt(Convert.FromBase64String(saKey), false);
                    //用默认密钥进行对称解密
                    sa.Mode = CipherMode.ECB;  //块处理模式
                    sa.Padding = PaddingMode.Zeros; //末尾数据块的填充模式
                    MemoryStream ms = new MemoryStream(encryptBinaryData);
                    CryptoStream cs = new CryptoStream(ms, sa.CreateDecryptor(), CryptoStreamMode.Read);
                    byte[] decryptBinaryData = new byte[encryptBinaryData.Length];
                    cs.Read(decryptBinaryData, 0, encryptBinaryData.Length);
                    int lastIndex = decryptBinaryData.Length;
                    while (lastIndex > 0 && decryptBinaryData[lastIndex - 1] == (byte)0)
                    {
                        lastIndex--;
                    }
                    byte[] subDecryptData = new byte[lastIndex];
                    System.Array.Copy(decryptBinaryData, subDecryptData, lastIndex);
                    return subDecryptData;
                }
                catch
                {
                    throw new Exception("您所使用的密钥无效!");
                }
            }
    
            /// <summary>
            /// 二进制流对二进制流的带签名的验证解密
            /// </summary>
            /// <param name="sourceData">需要解密的二进制流源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>解密后的二进制流数据</returns>
            public static byte[] SignatureDecryptBinaryToBinary(byte[] sourceData, string localKey, string remoteKey)
            {
                string encryptData = Encoding.GetEncoding(encodingType).GetString(sourceData);
                byte[] decryptBinaryData = SignatureDecryptStringToBinary(encryptData, localKey, remoteKey);
                return decryptBinaryData;
            }
    
            /// <summary>
            /// 二进制流对字符串的带签名的验证解密
            /// </summary>
            /// <param name="sourceData">需要解密的二进制流源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>解密后的字符串数据</returns>
            public static string SignatureDecryptBinaryToString(byte[] sourceData, string localKey, string remoteKey)
            {
                string encryptData = Encoding.GetEncoding(encodingType).GetString(sourceData);
                byte[] decryptBinaryData = SignatureDecryptStringToBinary(encryptData, localKey, remoteKey);
                string decryptData = Encoding.GetEncoding(encodingType).GetString(decryptBinaryData);
                return decryptData;
            }
    
            /// <summary>
            /// 字符串对字符串的带签名的验证解密
            /// </summary>
            /// <param name="sourceData">需要解密的字符串源数据</param>
            /// <param name="localKey">本地密钥</param>
            /// <param name="remoteKey">远程密钥</param>
            /// <returns>解密后的字符串数据</returns>
            public static string SignatureDecryptStringToString(string sourceData, string localKey, string remoteKey)
            {
                byte[] decryptBinaryData = SignatureDecryptStringToBinary(sourceData, localKey, remoteKey);
                string decryptData = Encoding.GetEncoding(encodingType).GetString(decryptBinaryData);
                return decryptData;
            }
    
    
    
    
            public static string RsaEncrypt(string data, string localKey, string remoteKey)
            {
                RSACryptoServiceProvider rsaLocal = new RSACryptoServiceProvider();
                RSACryptoServiceProvider rsaRemote = new RSACryptoServiceProvider();
                rsaLocal.ImportCspBlob(Convert.FromBase64String(localKey));
                rsaRemote.ImportCspBlob(Convert.FromBase64String(remoteKey));
                SymmetricAlgorithm sa = Rijndael.Create();
                sa.GenerateIV();
    
                //将对称密钥使用非对称加密算法加密并转换成base64
                string saKey = Convert.ToBase64String(rsaRemote.Encrypt(sa.Key, false));
    
                //将要加密的数据转换成二进制数据
                byte[] binaryData = Encoding.UTF8.GetBytes(data);
    
                byte[] encryptBinaryData = null;
                string encryptData = null;
                string sinagture = null;
    
                //对称加密开始
                sa.Mode = CipherMode.ECB;  //块处理模式
                sa.Padding = PaddingMode.Zeros; //末尾数据块的填充模式            
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write);
    
                cs.Write(binaryData, 0, binaryData.Length);
                cs.Close();
                encryptBinaryData = ms.ToArray();
                ms.Close();
                encryptData = Convert.ToBase64String(encryptBinaryData);
                //对称加密结束
    
    
                //签名
                sinagture = Convert.ToBase64String(rsaLocal.SignData(encryptBinaryData, new SHA1CryptoServiceProvider()));
    
                //返回结果:密文+密钥+签名
                return encryptData + "," + saKey + "," + sinagture;
            }
    
            public static string RsaDecrypt(string data, string localKey, string remoteKey)
            {
                if (string.IsNullOrEmpty(data))
                {
                    return null;
                }
                string[] dataParts = data.Split(',');
                if (dataParts.Length != 3)
                {
                    return null;
                }
                string encryptData = dataParts[0];
                string saKey = dataParts[1];
                string sinature = dataParts[2];
                byte[] encryptBinaryData = Convert.FromBase64String(encryptData);
    
                RSACryptoServiceProvider rsaLocal = new RSACryptoServiceProvider();
                RSACryptoServiceProvider rsaRemote = new RSACryptoServiceProvider();
                rsaLocal.ImportCspBlob(Convert.FromBase64String(localKey));
                rsaRemote.ImportCspBlob(Convert.FromBase64String(remoteKey));
                SymmetricAlgorithm sa = Rijndael.Create();
    
                //验证签名
                if (!rsaRemote.VerifyData(encryptBinaryData, new SHA1CryptoServiceProvider(), Convert.FromBase64String(sinature)))
                {
                    return null;
                }
    
                //还原对称加密Key
                sa.Key = rsaLocal.Decrypt(Convert.FromBase64String(saKey), false);
    
                //对称解密开始
                sa.Mode = CipherMode.ECB;  //块处理模式
                sa.Padding = PaddingMode.Zeros; //末尾数据块的填充模式
                MemoryStream ms = new MemoryStream(encryptBinaryData);
                CryptoStream cs = new CryptoStream(ms, sa.CreateDecryptor(), CryptoStreamMode.Read);
                byte[] decryptBinaryData = new byte[encryptBinaryData.Length];
                cs.Read(decryptBinaryData, 0, encryptBinaryData.Length);
                int lastIndex = decryptBinaryData.Length;
                while (lastIndex > 0 && decryptBinaryData[lastIndex - 1] == (byte)0)
                {
                    lastIndex--;
                }
                string decryptData = Encoding.UTF8.GetString(decryptBinaryData, 0, lastIndex);
                //对称解密结束
                return decryptData;
            }
        } 
    道之所在,虽千万人吾往矣
  • 相关阅读:
    java架构之路-(面试篇)Mysql面试大全
    web工程的路径问题详解
    SQL知识点总结
    Mybatis简介
    mysql大全
    配置心得
    spring4.1.3+springmvc+mybatis3.2.1整合
    jstl标签
    jstl标签库
    Java并发控制机制
  • 原文地址:https://www.cnblogs.com/kongdf/p/2566518.html
Copyright © 2011-2022 走看看