RSA算法C#.net源代码,尽量详细,不要用C#中默认的RSA算法,谢谢

解决方案 »

  1.   

    这个啊。在网上应该能够找到吧。自己有空了研究一下。
    这个POST一个网上找到的。
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    using System.Xml;/**
    RSA算法工具
    */
    namespace RSAUtil{ public class RSAHandler{
    public RSACryptoServiceProvider CreateRSAProvider(String privateKeyFile){
    RSAParameters parameters1;
    parameters1 = new RSAParameters();
    StreamReader reader1 = new StreamReader(privateKeyFile);
    XmlDocument document1 = new XmlDocument();
    document1.LoadXml(reader1.ReadToEnd());
    XmlElement element1 = (XmlElement) document1.SelectSingleNode("root");
    parameters1.Modulus = ReadChild(element1, "Modulus");
    parameters1.Exponent = ReadChild(element1, "Exponent");
    parameters1.D = ReadChild(element1, "D");
    parameters1.DP = ReadChild(element1, "DP");
    parameters1.DQ = ReadChild(element1, "DQ");
    parameters1.P = ReadChild(element1, "P");
    parameters1.Q = ReadChild(element1, "Q");
    parameters1.InverseQ = ReadChild(element1, "InverseQ");
    CspParameters parameters2 = new CspParameters();
    parameters2.Flags = CspProviderFlags.UseMachineKeyStore;
    RSACryptoServiceProvider provider1 = new RSACryptoServiceProvider(parameters2);
    provider1.ImportParameters(parameters1);
    return provider1;
    } public RSACryptoServiceProvider CreateRSAEncryptProvider(String publicKeyFile){
    RSAParameters parameters1;
    parameters1 = new RSAParameters();
    StreamReader reader1 = new StreamReader(publicKeyFile);
    XmlDocument document1 = new XmlDocument();
    document1.LoadXml(reader1.ReadToEnd());
    XmlElement element1 = (XmlElement) document1.SelectSingleNode("root");
    parameters1.Modulus = ReadChild(element1, "Modulus");
    parameters1.Exponent = ReadChild(element1, "Exponent");
    CspParameters parameters2 = new CspParameters();
    parameters2.Flags = CspProviderFlags.UseMachineKeyStore;
    RSACryptoServiceProvider provider1 = new RSACryptoServiceProvider(parameters2);
    provider1.ImportParameters(parameters1);
    return provider1;
    } public RSAPKCS1SignatureDeformatter CreateRSADeformatter(String publicKeyFile)
    {
      RSAParameters parameters1;
      parameters1 = new RSAParameters();
      StreamReader reader1 = new StreamReader(publicKeyFile);
      XmlDocument document1 = new XmlDocument();
      document1.LoadXml(reader1.ReadToEnd());
      XmlElement element1 = (XmlElement) document1.SelectSingleNode("root");
      parameters1.Modulus = ReadChild(element1, "Modulus");
      parameters1.Exponent = ReadChild(element1, "Exponent");
      CspParameters parameters2 = new CspParameters();
      parameters2.Flags = CspProviderFlags.UseMachineKeyStore;
      RSACryptoServiceProvider provider1 = new RSACryptoServiceProvider(parameters2);
      provider1.ImportParameters(parameters1);
      RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(provider1);
      deformatter.SetHashAlgorithm("SHA1");
      return deformatter;
    } public RSAPKCS1SignatureFormatter CreateRSAFormatter(String privateKeyFile)
    {
      RSAParameters parameters1;
      parameters1 = new RSAParameters();
      StreamReader reader1 = new StreamReader(privateKeyFile);
      XmlDocument document1 = new XmlDocument();
      document1.LoadXml(reader1.ReadToEnd());
      XmlElement element1 = (XmlElement) document1.SelectSingleNode("root");
      parameters1.Modulus = ReadChild(element1, "Modulus");
      parameters1.Exponent = ReadChild(element1, "Exponent");
      parameters1.D = ReadChild(element1, "D");
      parameters1.DP = ReadChild(element1, "DP");
      parameters1.DQ = ReadChild(element1, "DQ");
      parameters1.P = ReadChild(element1, "P");
      parameters1.Q = ReadChild(element1, "Q");
      parameters1.InverseQ = ReadChild(element1, "InverseQ");
      CspParameters parameters2 = new CspParameters();
      parameters2.Flags = CspProviderFlags.UseMachineKeyStore;
      RSACryptoServiceProvider provider1 = new RSACryptoServiceProvider(parameters2);
      provider1.ImportParameters(parameters1);
      RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(provider1);
      formatter.SetHashAlgorithm("SHA1");
      return formatter;
    }

    public byte[] GetHashData(byte[] data){
    HashAlgorithm algorithm1 = HashAlgorithm.Create("SHA1");
    return algorithm1.ComputeHash(data);
    } public byte[] GetHashData(Stream data){
    HashAlgorithm algorithm1 = HashAlgorithm.Create("SHA1");
    return algorithm1.ComputeHash(data);
    } private byte[] ReadChild(XmlElement parent, string name)
    {
      XmlElement element1 = (XmlElement) parent.SelectSingleNode(name);
      return Convert.FromBase64String(element1.InnerText);
    }
    }
    }
      

  2.   

    RSACryptoServiceProvider oRsac = new RSACryptoServiceProvider();
      

  3.   

    参考
    http://www.cnblogs.com/lyzhong/articles/39613.aspx
      

  4.   

    呵呵,iheshi,写出来能发给我一份么?我很感谢!
      

  5.   

    呵呵,fancy,你也找到这个blog了啊!我以前有看这个,不过上面有错误的,我运行了的
      

  6.   

    iheshi 写完了能发到我邮箱里么,[email protected]
      

  7.   

    另外谁能提供个创建XML文件和公私钥在XML文件的保存的代码
      

  8.   

    using System;
    using System.Security.Cryptography;
    using System.IO;
    using System.Text;
    using System.Web.Security;namespace Paladin.Common
    {
    /// <summary>
    /// Security 的摘要说明。
    /// 对称加密算法 : DES / TripleDES / RC2 / Rijndael
    /// 非对称加密算法 : DSA / RSA
    /// Base64 算法
    /// </summary>
    public class Cryptography
    {
    public Cryptography()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    // DES  的加密方法 。
    // 私钥加密 / 对称算法 。
    public static string Encrypt_Des( string cleanString )
    {
    //.NET 框架提供的对称加密类需要一个密钥和一个新的 IV 来加密和解密数据。
    //每当使用默认的构造函数创建其中一个托管对称加密类的新实例时,就会自动创建新的密钥和 IV
    //DES 使用 64 位密钥、64 位块来加密和解密数据。每个数据块迭代 16 次以生成加密文本。
    //初始化向量(IV) 用来第一次对数据块进行加密 。
    byte[] KEY_64 = {42, 16, 93, 156, 78, 4, 218, 32}; // 指定的 Key
    byte[] IV_64 = {55, 103, 246, 79, 36, 99, 167, 3}; // 初始化向量(IV)
    DESCryptoServiceProvider provider = new DESCryptoServiceProvider ( ) ;
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream( ms , provider.CreateEncryptor( KEY_64,IV_64 ) , CryptoStreamMode.Write ) ;
    StreamWriter sw = new StreamWriter( cs ) ;
    sw.Write( cleanString ) ;
    sw.Flush( ) ;
    cs.FlushFinalBlock( ) ;
    ms.Flush( ) ;
    return Convert.ToBase64String( ms.GetBuffer( ) , 0 , int.Parse( ( ms.Length.ToString ( ) ) ) ) ;
    } // DES  的解密方法 。
    // 私钥加密 / 对称算法 。
    public static string Decrypt_Des( string encryptedString )
    {
    byte[] KEY_64 = {42, 16, 93, 156, 78, 4, 218, 32};
    byte[] IV_64 = {55, 103, 246, 79, 36, 99, 167, 3};
    DESCryptoServiceProvider provider = new DESCryptoServiceProvider ( ) ;
    byte[] buffer = Convert.FromBase64String( encryptedString ) ;
    MemoryStream ms = new MemoryStream ( buffer ) ;
    CryptoStream cs = new CryptoStream( ms,provider.CreateDecryptor( KEY_64,IV_64 ) , CryptoStreamMode.Read ) ;
    StreamReader sr = new StreamReader( cs ) ;
    return sr.ReadToEnd ( ) ; } // hash 加密
    public static string Encrypt_Hash(string cleanString)
    {
    Byte[] clearBytes = new UnicodeEncoding().GetBytes(cleanString);
    Byte[] hashedBytes = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);

    return BitConverter.ToString(hashedBytes);
    } // sha1 的方式加密密码
    public  static String Encrypt_Sha1( String oriPassWrd )
    {
    String returnstr=""; returnstr = FormsAuthentication.HashPasswordForStoringInConfigFile( oriPassWrd , "sha1" ); return returnstr; } // DSA 的数字签名
    // RSA 类似,不过RSA比DSA慢得多,但比DSA安全。RSA可以选择关键字的大小,越大越安全
    public static byte[]  DsaCrypto_SignData ( string content , ref string dsaXmlString )
    {
    //先要将字符串转换为字节数组,这与编码有关。
    // String content = "this is a test.";
    byte[] bytes = Encoding.ASCII.GetBytes( content );
    //选择签名方式,有RSA和DSA
    DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();
    byte[] sign = dsac.SignData( bytes );
    //当前 Dsa 对象的 xml 表示字符串 。
    dsaXmlString = dsac.ToXmlString( false ) ;
    //sign便是出来的签名结果。
    return sign ;
    } // DSA 的数字签名认证
    public static void DsaCrypto_VerifyData (string content , byte[] sign , string dsaXmlString )
    {
    byte[] bytes = Encoding.ASCII.GetBytes( content );
    //下面是认证了
    // DSACryptoServiceProvider dsac2 = new DSACryptoServiceProvider();
    // dsac2.FromXmlString( dsac.ToXmlString( false ) );
    // bool _verify = dsac2.VerifyData( bytes, sign );
    DSACryptoServiceProvider dsac = new DSACryptoServiceProvider();
    dsac.FromXmlString( dsaXmlString );
    bool _verify = dsac.VerifyData( bytes, sign );
    if ( _verify ) 
    {
    common.setMessage ( "通过" ) ;

    else 
    {
    common.setMessage ( "不能通过" ) ;
    }
    }
    }//class
    }
      

  9.   

    RSA其实很简单,你随便看一篇文章,就可以写出来了。
      

  10.   

    都用.net framework类库,楼主是想自己写一个吧,呵呵,我不会....
      

  11.   

    代码到处都是,最不济还可以reflector一个出来。mono里面不会没有吧?