RSA加密解密及RSA签名和验证

来源:互联网 发布:淘宝收到法院传票 编辑:程序博客网 时间:2024/05/16 19:10

1.RSA加密解密:
 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密
2.RSA签名和验证
 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)获取待签名的Hash码 (3)获取签名的字符串 (4)验证

3.公钥与私钥的理解:
 (1)私钥用来进行解密和签名,是给自己用的。
 (2)公钥由本人公开,用于加密和验证签名,是给别人用的。
   (3)当该用户发送文件时,用私钥签名,别人用他给的公钥验证签名,可以保证该信息是由他发送的。当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他接收到。

class RSACryption{            #region RSA 加密解密    #region RSA 的密钥产生    /// <summary>    /// RSA产生密钥    /// </summary>    /// <param name="xmlKeys">私钥</param>    /// <param name="xmlPublicKey">公钥</param>    public void RSAKey(out string xmlKeys, out string xmlPublicKey)    {        try        {            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();            xmlKeys = rsa.ToXmlString(true);            xmlPublicKey = rsa.ToXmlString(false);        }        catch (Exception ex)        {            throw ex;        }    }    #endregion    #region RSA加密函数    //##############################################################################     //RSA 方式加密     //KEY必须是XML的形式,返回的是字符串     //该加密方式有长度限制的!    //##############################################################################            /// <summary>    /// RSA的加密函数    /// </summary>    /// <param name="xmlPublicKey">公钥</param>    /// <param name="encryptString">待加密的字符串</param>    /// <returns></returns>    public string RSAEncrypt(string xmlPublicKey, string encryptString)    {        try        {            byte[] PlainTextBArray;            byte[] CypherTextBArray;            string Result;            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();            rsa.FromXmlString(xmlPublicKey);            PlainTextBArray = (new UnicodeEncoding()).GetBytes(encryptString);            CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);            Result = Convert.ToBase64String(CypherTextBArray);            return Result;        }        catch (Exception ex)        {            throw ex;        }    }            /// <summary>    /// RSA的加密函数     /// </summary>    /// <param name="xmlPublicKey">公钥</param>    /// <param name="EncryptString">待加密的字节数组</param>    /// <returns></returns>    public string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)    {        try        {            byte[] CypherTextBArray;            string Result;            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();            rsa.FromXmlString(xmlPublicKey);            CypherTextBArray = rsa.Encrypt(EncryptString, false);            Result = Convert.ToBase64String(CypherTextBArray);            return Result;        }        catch (Exception ex)        {            throw ex;        }    }    #endregion    #region RSA的解密函数            /// <summary>    /// RSA的解密函数    /// </summary>    /// <param name="xmlPrivateKey">私钥</param>    /// <param name="decryptString">待解密的字符串</param>    /// <returns></returns>    public string RSADecrypt(string xmlPrivateKey, string decryptString)    {        try        {            byte[] PlainTextBArray;            byte[] DypherTextBArray;            string Result;            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();            rsa.FromXmlString(xmlPrivateKey);            PlainTextBArray = Convert.FromBase64String(decryptString);            DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);            return Result;        }        catch (Exception ex)        {            throw ex;        }    }            /// <summary>    /// RSA的解密函数     /// </summary>    /// <param name="xmlPrivateKey">私钥</param>    /// <param name="DecryptString">待解密的字节数组</param>    /// <returns></returns>    public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)    {        try        {            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;        }        catch (Exception ex)        {            throw ex;        }    }    #endregion    #endregion    #region RSA数字签名    #region 获取Hash描述表            /// <summary>    /// 获取Hash描述表    /// </summary>    /// <param name="strSource">待签名的字符串</param>    /// <param name="HashData">Hash描述</param>    /// <returns></returns>    public bool GetHash(string strSource, ref byte[] HashData)    {        try        {                           byte[] Buffer;            System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");            Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strSource);            HashData = MD5.ComputeHash(Buffer);            return true;        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// 获取Hash描述表    /// </summary>    /// <param name="strSource">待签名的字符串</param>    /// <param name="strHashData">Hash描述</param>    /// <returns></returns>    public bool GetHash(string strSource, ref string strHashData)    {        try        {            //从字符串中取得Hash描述             byte[] Buffer;            byte[] HashData;            System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");            Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strSource);            HashData = MD5.ComputeHash(Buffer);            strHashData = Convert.ToBase64String(HashData);            return true;        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// 获取Hash描述表    /// </summary>    /// <param name="objFile">待签名的文件</param>    /// <param name="HashData">Hash描述</param>    /// <returns></returns>    public bool GetHash(System.IO.FileStream objFile, ref byte[] HashData)    {        try        {            //从文件中取得Hash描述             System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");            HashData = MD5.ComputeHash(objFile);            objFile.Close();            return true;        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// 获取Hash描述表    /// </summary>    /// <param name="objFile">待签名的文件</param>    /// <param name="strHashData">Hash描述</param>    /// <returns></returns>    public bool GetHash(System.IO.FileStream objFile, ref string strHashData)    {        try        {            //从文件中取得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;        }        catch (Exception ex)        {            throw ex;        }    }    #endregion    #region RSA签名    /// <summary>    /// RSA签名    /// </summary>    /// <param name="strKeyPrivate">私钥</param>    /// <param name="HashbyteSignature">待签名Hash描述</param>    /// <param name="EncryptedSignatureData">签名后的结果</param>    /// <returns></returns>    public bool SignatureFormatter(string strKeyPrivate, byte[] HashbyteSignature, ref byte[] EncryptedSignatureData)    {        try        {            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(strKeyPrivate);            System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);            //设置签名的算法为MD5             RSAFormatter.SetHashAlgorithm("MD5");            //执行签名             EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);            return true;        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// RSA签名    /// </summary>    /// <param name="strKeyPrivate">私钥</param>    /// <param name="HashbyteSignature">待签名Hash描述</param>    /// <param name="m_strEncryptedSignatureData">签名后的结果</param>    /// <returns></returns>    public bool SignatureFormatter(string strKeyPrivate, byte[] HashbyteSignature, ref string strEncryptedSignatureData)    {        try        {            byte[] EncryptedSignatureData;            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(strKeyPrivate);            System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);            //设置签名的算法为MD5             RSAFormatter.SetHashAlgorithm("MD5");            //执行签名             EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);            strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);            return true;        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// RSA签名    /// </summary>    /// <param name="strKeyPrivate">私钥</param>    /// <param name="strHashbyteSignature">待签名Hash描述</param>    /// <param name="EncryptedSignatureData">签名后的结果</param>    /// <returns></returns>    public bool SignatureFormatter(string strKeyPrivate, string strHashbyteSignature, ref byte[] EncryptedSignatureData)    {        try        {            byte[] HashbyteSignature;            HashbyteSignature = Convert.FromBase64String(strHashbyteSignature);            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(strKeyPrivate);            System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);            //设置签名的算法为MD5             RSAFormatter.SetHashAlgorithm("MD5");            //执行签名             EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);            return true;        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// RSA签名    /// </summary>    /// <param name="strKeyPrivate">私钥</param>    /// <param name="strHashbyteSignature">待签名Hash描述</param>    /// <param name="strEncryptedSignatureData">签名后的结果</param>    /// <returns></returns>    public bool SignatureFormatter(string strKeyPrivate, string strHashbyteSignature, ref string strEncryptedSignatureData)    {        try        {            byte[] HashbyteSignature;            byte[] EncryptedSignatureData;            HashbyteSignature = Convert.FromBase64String(strHashbyteSignature);            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(strKeyPrivate);            System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);            //设置签名的算法为MD5             RSAFormatter.SetHashAlgorithm("MD5");            //执行签名             EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);            strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);            return true;        }        catch (Exception ex)        {            throw ex;        }    }    #endregion    #region RSA 签名验证    /// <summary>    /// RSA签名验证    /// </summary>    /// <param name="strKeyPublic">公钥</param>    /// <param name="HashbyteDeformatter">Hash描述</param>    /// <param name="DeformatterData">签名后的结果</param>    /// <returns></returns>    public bool SignatureDeformatter(string strKeyPublic, byte[] HashbyteDeformatter, byte[] DeformatterData)    {        try        {            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(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;            }        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// RSA签名验证    /// </summary>    /// <param name="strKeyPublic">公钥</param>    /// <param name="strHashbyteDeformatter">Hash描述</param>    /// <param name="DeformatterData">签名后的结果</param>    /// <returns></returns>    public bool SignatureDeformatter(string strKeyPublic, string strHashbyteDeformatter, byte[] DeformatterData)    {        try        {            byte[] HashbyteDeformatter;            HashbyteDeformatter = Convert.FromBase64String(strHashbyteDeformatter);            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(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;            }        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// RSA签名验证    /// </summary>    /// <param name="strKeyPublic">公钥</param>    /// <param name="HashbyteDeformatter">Hash描述</param>    /// <param name="strDeformatterData">签名后的结果</param>    /// <returns></returns>    public bool SignatureDeformatter(string strKeyPublic, byte[] HashbyteDeformatter, string strDeformatterData)    {        try        {            byte[] DeformatterData;            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(strKeyPublic);            System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);            //指定解密的时候HASH算法为MD5             RSADeformatter.SetHashAlgorithm("MD5");            DeformatterData = Convert.FromBase64String(strDeformatterData);            if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))            {                return true;            }            else            {                return false;            }        }        catch (Exception ex)        {            throw ex;        }    }    /// <summary>    /// RSA签名验证    /// </summary>    /// <param name="strKeyPublic">公钥</param>    /// <param name="strHashbyteDeformatter">Hash描述</param>    /// <param name="strDeformatterData">签名后的结果</param>    /// <returns></returns>    public bool SignatureDeformatter(string strKeyPublic, string strHashbyteDeformatter, string strDeformatterData)    {        try        {            byte[] DeformatterData;            byte[] HashbyteDeformatter;            HashbyteDeformatter = Convert.FromBase64String(strHashbyteDeformatter);            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();            RSA.FromXmlString(strKeyPublic);            System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);            //指定解密的时候HASH算法为MD5             RSADeformatter.SetHashAlgorithm("MD5");            DeformatterData = Convert.FromBase64String(strDeformatterData);            if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))            {                return true;            }            else            {                return false;            }        }        catch (Exception ex)        {            throw ex;        }    }    #endregion    #endregion }


0 0
原创粉丝点击