zoukankan      html  css  js  c++  java
  • RSA加密解密和读取公钥、私钥

    /// <summary>
        /// RSA加密解密及RSA签名和验证
        /// </summary>
        public class RSADE
        {         
            public RSADE()
            {             
            }
            

            #region RSA 加密解密

            #region RSA 的密钥产生
        
            /// <summary>
            /// RSA 的密钥产生 产生私钥 和公钥
            /// </summary>
            /// <param name="xmlKeys"></param>
            /// <param name="xmlPublicKey"></param>
            public void RSAKey(out string xmlKeys,out string xmlPublicKey)
            {             
                    System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
                    xmlKeys=rsa.ToXmlString(true);
                    xmlPublicKey = rsa.ToXmlString(false);             
            }
            #endregion

            #region RSA的加密函数
            //##############################################################################
            //RSA 方式加密
            //说明KEY必须是XML的行式,返回的是字符串
            //在有一点需要说明!!该加密方式有 长度 限制的!!
            //##############################################################################

            //RSA的加密函数  string
            public string RSAEncrypt(string xmlPublicKey,string m_strEncryptString )
            {
                
                byte[] PlainTextBArray;
                byte[] CypherTextBArray;
                string Result;
                RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPublicKey);
                PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
                CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
                Result=Convert.ToBase64String(CypherTextBArray);
                return Result;
                
            }
            //RSA的加密函数 byte[]
            public string RSAEncrypt(string xmlPublicKey,byte[] EncryptString )
            {
                
                byte[] CypherTextBArray;
                string Result;
                RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPublicKey);
                CypherTextBArray = rsa.Encrypt(EncryptString, false);
                Result=Convert.ToBase64String(CypherTextBArray);
                return Result;
                
            }
            #endregion

            #region RSA的解密函数
            //RSA的解密函数  string
            public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString )
            {            
                byte[] PlainTextBArray;
                byte[] DypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPrivateKey);
                PlainTextBArray =Convert.FromBase64String(m_strDecryptString);
                DypherTextBArray=rsa.Decrypt(PlainTextBArray, false);
                Result=(new UnicodeEncoding()).GetString(DypherTextBArray);
                return Result;
                
            }

            //RSA的解密函数  byte
            public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString )
            {            
                byte[] DypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa=new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPrivateKey);
                DypherTextBArray=rsa.Decrypt(DecryptString, false);
                Result=(new UnicodeEncoding()).GetString(DypherTextBArray);
                return Result;
                
            }
            #endregion

            #endregion

            #region RSA数字签名

            #region 获取Hash描述表
            //获取Hash描述表
            public bool GetHash(string m_strSource, ref byte[] HashData)
            {             
                //从字符串中取得Hash描述
                byte[] Buffer;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
                HashData = MD5.ComputeHash(Buffer);

                return true;             
            }

            //获取Hash描述表
            public bool GetHash(string m_strSource, ref string strHashData)
            {
                
                //从字符串中取得Hash描述
                byte[] Buffer;
                byte[] HashData;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
                HashData = MD5.ComputeHash(Buffer);

                strHashData = Convert.ToBase64String(HashData);
                return true;
                
            }

            //获取Hash描述表
            public bool GetHash(System.IO.FileStream objFile, ref byte[] HashData)
            {
                
                //从文件中取得Hash描述
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                HashData = MD5.ComputeHash(objFile);
                objFile.Close();

                return true;
                
            }

            //获取Hash描述表
            public bool GetHash(System.IO.FileStream objFile, ref string strHashData)
            {
                
                //从文件中取得Hash描述
                byte[] HashData;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                HashData = MD5.ComputeHash(objFile);
                objFile.Close();

                strHashData = Convert.ToBase64String(HashData);

                return true;
                
            }
            #endregion

            #region RSA签名
            //RSA签名
            public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref byte[] EncryptedSignatureData)
            {
                
                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPrivate);
                    System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                    //设置签名的算法为MD5
                    RSAFormatter.SetHashAlgorithm("MD5");
                    //执行签名
                    EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                    return true;
                
            }

            //RSA签名
            public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref string m_strEncryptedSignatureData)
            {
                
                    byte[] EncryptedSignatureData;

                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPrivate);
                    System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                    //设置签名的算法为MD5
                    RSAFormatter.SetHashAlgorithm("MD5");
                    //执行签名
                    EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                    m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);

                    return true;
                
            }

            //RSA签名
            public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref byte[] EncryptedSignatureData)
            {
                
                    byte[] HashbyteSignature;

                    HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature);
                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPrivate);
                    System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                    //设置签名的算法为MD5
                    RSAFormatter.SetHashAlgorithm("MD5");
                    //执行签名
                    EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                    return true;
                
            }

            //RSA签名
            public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref string m_strEncryptedSignatureData)
            {
                
                    byte[] HashbyteSignature;
                    byte[] EncryptedSignatureData;

                    HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature);
                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPrivate);
                    System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                    //设置签名的算法为MD5
                    RSAFormatter.SetHashAlgorithm("MD5");
                    //执行签名
                    EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);

                    m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);

                    return true;
                
            }
            #endregion

            #region RSA 签名验证

            public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, byte[] DeformatterData)
            {
                
                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPublic);
                    System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                    //指定解密的时候HASH算法为MD5
                    RSADeformatter.SetHashAlgorithm("MD5");

                    if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                
            }

            public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, byte[] DeformatterData)
            {
                
                    byte[] HashbyteDeformatter;

                    HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter);

                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPublic);
                    System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                    //指定解密的时候HASH算法为MD5
                    RSADeformatter.SetHashAlgorithm("MD5");

                    if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                
            }

            public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, string p_strDeformatterData)
            {
                
                    byte[] DeformatterData;

                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPublic);
                    System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                    //指定解密的时候HASH算法为MD5
                    RSADeformatter.SetHashAlgorithm("MD5");

                    DeformatterData =Convert.FromBase64String(p_strDeformatterData);

                    if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                
            }

            public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData)
            {
                
                    byte[] DeformatterData;
                    byte[] HashbyteDeformatter;

                    HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter);
                    System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();

                    RSA.FromXmlString(p_strKeyPublic);
                    System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                    //指定解密的时候HASH算法为MD5
                    RSADeformatter.SetHashAlgorithm("MD5");

                    DeformatterData =Convert.FromBase64String(p_strDeformatterData);

                    if(RSADeformatter.VerifySignature(HashbyteDeformatter,DeformatterData))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                
            }


            #endregion


            #endregion

            #region 获取加密解密证书
            /// <summary>
            /// 取得证书私钥
            /// </summary>
            /// <param name="pfxPath">证书的绝对路径</param>
            /// <param name="password">访问证书的密码</param>
            /// <returns></returns>
            public static String GetPrivateKey( string pfxPath, string password )
            {
                X509Certificate2 pfx = new X509Certificate2( pfxPath, password, X509KeyStorageFlags.Exportable );
                string privateKey = pfx.PrivateKey.ToXmlString( true );
                return privateKey;
            }


            /// <summary>
            /// 取得证书的公钥
            /// </summary>
            /// <param name="cerPath">证书的绝对路径</param>
            /// <returns></returns>
            public static String GetPublicKey( string cerPath )
            {
                X509Certificate2 cer = new X509Certificate2( cerPath );
                string publicKey = cer.PublicKey.Key.ToXmlString( false );
                return publicKey;
            }
            #endregion
        }

  • 相关阅读:
    Mac php使用gd库出错 Call to undefined function imagettftext()
    centos 使用 locate
    Mac HomeBrew 安装 mysql
    zsh 命令提示符 PROMPT
    新的开始
    Java 面试题分析
    Java NIO Show All Files
    正确使用 Volatile 变量
    面试题整理 2017
    有10阶梯, 每次走1,2 or 3 阶,有多少种方式???
  • 原文地址:https://www.cnblogs.com/tonglei/p/4422848.html
Copyright © 2011-2022 走看看