C# RSA的加解密与签名验证    

C# RSA的加解密与签名验证

最近做了一个CS架构的序列号生成器,用到 RSA加解密技术,以下是RSA的使用方法

RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德•李维斯特(Ron Rivest)、阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。.Net的推出,我们能够利用.Net Framework中的类提供的加密服务来保证数据安全。目前应用较为广泛的加密方法是使用RSA算法进行加密。在.Net Framework中与RSA加密算法相关的类主要有两个:RSA 类和RSACryptoServiceProvider 类。按照MSDN的说法RSA 类是“表示 RSA 算法的所有实现均从中继承的基类”,而RSACryptoServiceProvider 类是“使用加密服务提供程序 (CSP) 提供的 RSA 算法的实现执行不对称加密和解密”。另外,“表示 RSA 算法的标准参数”的RSAParameters 结构也是很重要的,它保存了RSA算法的参数。

生成公钥和私钥文件

using System.Security.Cryptography;
using System.IO;
////// 生成公钥、私钥
//////私钥文件保存路径,包含文件名///公钥文件保存路径,包含文件名public void RSAKey(string PrivateKeyPath, string PublicKeyPath)
{
    RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
    SaveKey(PrivateKeyPath, provider.ToXmlString(true));//保存私钥文件
    SaveKey(PublicKeyPath, provider.ToXmlString(false));//保存公钥文件
}
////// 保存公钥/私钥文件
//////公钥/私钥文件保存路径///公钥/私钥值public void SaveKey(string path, string key)
{
    FileStream stream = new FileStream(path, FileMode.Create);
    StreamWriter sw = new StreamWriter(stream);
    sw.WriteLine(key);
    sw.Close();
    stream.Close();
}

  

 

加密与解密

////// RSA加密
//////公钥///需要加密的数据///RSA公钥加密后的数据public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
{
    string str2;
    try
    {
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        provider.FromXmlString(xmlPublicKey);
        byte[] bytes = new UnicodeEncoding().GetBytes(m_strEncryptString);
        str2 = Convert.ToBase64String(provider.Encrypt(bytes, false));
    }
    catch (Exception exception)
    {
        throw exception;
    }
    return str2;
}

////// RSA解密
//////私钥///需要解密的数据///解密后的数据public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
{
    string str2;
    try
    {
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        provider.FromXmlString(xmlPrivateKey);
        byte[] rgb = Convert.FromBase64String(m_strDecryptString);
        byte[] buffer2 = provider.Decrypt(rgb, false);
        str2 = new UnicodeEncoding().GetString(buffer2);
    }
    catch (Exception exception)
    {
        throw exception;
    }
    return str2;
}

   

签名与签名验证

////// 签名
//////私钥///需签名的数据///签名后的值public string SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature)
{
    byte[] rgbHash = Convert.FromBase64String(m_strHashbyteSignature);
    RSACryptoServiceProvider key = new RSACryptoServiceProvider();
    key.FromXmlString(p_strKeyPrivate);
    RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
    formatter.SetHashAlgorithm("MD5");
    byte[] inArray = formatter.CreateSignature(rgbHash);
    return Convert.ToBase64String(inArray);
}

////// 签名验证
//////公钥///待验证的用户名///注册码///签名是否符合public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData)
{
    try
    {
        byte[] rgbHash = Convert.FromBase64String(p_strHashbyteDeformatter);
        RSACryptoServiceProvider key = new RSACryptoServiceProvider();
        key.FromXmlString(p_strKeyPublic);
        RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);
        deformatter.SetHashAlgorithm("MD5");
        byte[] rgbSignature = Convert.FromBase64String(p_strDeformatterData);
        if (deformatter.VerifySignature(rgbHash, rgbSignature))
        {
            return true;
        }
        return false;
    }
    catch
    {
        return false;
    }
}