zoukankan      html  css  js  c++  java
  • 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;
    /// <summary>
    /// 生成公钥、私钥
    /// </summary>
    /// <param name="PrivateKeyPath">私钥文件保存路径,包含文件名</param>
    /// <param name="PublicKeyPath">公钥文件保存路径,包含文件名</param>
    public void RSAKey(string PrivateKeyPath, string PublicKeyPath)
    {
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        SaveKey(PrivateKeyPath, provider.ToXmlString(true));//保存私钥文件
        SaveKey(PublicKeyPath, provider.ToXmlString(false));//保存公钥文件
    }
    /// <summary>
    /// 保存公钥/私钥文件
    /// </summary>
    /// <param name="path">公钥/私钥文件保存路径</param>
    /// <param name="publickey">公钥/私钥值</param>
    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();
    }
    

      

    加密与解密

    /// <summary>
    /// RSA加密
    /// </summary>
    /// <param name="xmlPublicKey">公钥</param>
    /// <param name="m_strEncryptString">需要加密的数据</param>
    /// <returns>RSA公钥加密后的数据</returns>
    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;
    }
    
    /// <summary>
    /// RSA解密
    /// </summary>
    /// <param name="xmlPrivateKey">私钥</param>
    /// <param name="m_strDecryptString">需要解密的数据</param>
    /// <returns>解密后的数据</returns>
    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;
    }
    

       

    签名与签名验证

    /// <summary>
    /// 签名
    /// </summary>
    /// <param name="p_strKeyPrivate">私钥</param>
    /// <param name="m_strHashbyteSignature">需签名的数据</param>
    /// <returns>签名后的值</returns>
    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);
    }
    
    /// <summary>
    /// 签名验证
    /// </summary>
    /// <param name="p_strKeyPublic">公钥</param>
    /// <param name="p_strHashbyteDeformatter">待验证的用户名</param>
    /// <param name="p_strDeformatterData">注册码</param>
    /// <returns>签名是否符合</returns>
    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;
        }
    }

    小工具成功开发完成。。。。。。
    转摘  https://www.cnblogs.com/lijialong/archive/2010/07/12/rsa.html
  • 相关阅读:
    (Vedctor经典)A
    C++ map用法
    (约瑟夫应用)5.4.1 Roman Roulette
    部分题集代码
    随机生成数
    如何在AutoCAD中实现鼠标双击事件
    浅谈JS之Error对象
    自定义微信小程序swiper轮播图面板指示点的样式
    物理像素与逻辑像素相关概念
    微信小程序中padding-right和margin-right无效
  • 原文地址:https://www.cnblogs.com/axinno1/p/8493716.html
Copyright © 2011-2022 走看看