小伟

小伟

 

RSA签名 和 RSA加密解密

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;//引入命名空间


//我们使用公钥加密(不对称加密)来实现注册码的算法。

//公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。
//公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。
//对于注册码来说,我们使用私钥来对一个字符串(用户名)签名,然后使用公钥对这个签名(注册码)进行验证。
//由于公钥只能用于验证,所以我们可以放心把公钥分发出去;私钥匙用来进行签名的,所以私钥匙要保存在开发者手中的。
//这样就达到了注册认证的目的。目前使用“用户名、注册码”模式注册的软件都应该是使用这一技术。

namespace SecretKey
{
    public partial class SecretKey : Form
    {
        public SecretKey()
        {
            InitializeComponent();
        }

        private void btn_create_Click(object sender, EventArgs e)
        {
            //首先我们生成自己要使用的一个公钥和私钥。

            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            txt_PublicKey.Text = RSA.ToXmlString(false);
            txt_PrivateKey.Text = RSA.ToXmlString(true);

            //RSACryptoServiceProvider类提供RSA算法的实现执行不对称加密和解密。
            //通过ToXMLString就可以生成我们需要的公钥和私钥。
            //当参数为False的时候,仅生成公钥;
            //True的时候将会把公钥和私钥全部生成。
            //我们一般通过ToXmlString(False)得到一个公钥字符串;
            //通过ToXmlString(True)得到一个私钥字符串(虽然其中含有公钥)。
            //我们可以将这两个密钥保存在本机上面,通过字符串常量定义并使用。
            //也就是说我们的注册信息将使用唯一的公钥和私钥。


        }

        private void btn_Sign_Click(object sender, EventArgs e)
        {
            //然后我们通过私钥对指定的字符串进行签名。

            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(txt_PrivateKey.Text);
            // 加密对象   
            RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(RSA);
            f.SetHashAlgorithm("SHA1");
            byte[] source = System.Text.ASCIIEncoding.ASCII.GetBytes(txt_UserName.Text);
            SHA1Managed sha = new SHA1Managed();
            byte[] result = sha.ComputeHash(source);
            byte[] b = f.CreateSignature(result);
            txt_registrationcode.Text = Convert.ToBase64String(b);

            //通过刚才得到的私钥重新初始化rsa对象,然后通过RSAPKCS1SignatureFormatter类来进行签名。
            //我们将输入的字符串转化成字节数组(我们这里默认用户名只能由ASCII字符组成),
            //通过SHA1哈西算法计算其哈希值。再使用CreateSignature方法将得到的哈西值进行签名。
            //最后我们将得到的字节数组转化成字符串作为注册码。这就是生成注册码的过程。
            //我们可以重复使用这一段程序对不同的用户名进行签名,从而得到与之对应的不同注册码。
        }

        private void btn_check_Click(object sender, EventArgs e)
        {
            //最后我们把刚才得到的用户名和注册码利用公钥进行验证。

            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(txt_PrivateKey.Text);
            RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(RSA);
            f.SetHashAlgorithm("SHA1");
            byte[] key = Convert.FromBase64String(this.txt_registrationcode.Text);
            SHA1Managed sha = new SHA1Managed();
            byte[] name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(txt_UserName.Text));
            string s = Convert.ToBase64String(name);
            if (f.VerifySignature(name, key))
                this.label5.Text = "验证成功!";
            else
                this.label5.Text = "验证失败!";

            //一次我们使用公钥来初始化rsa对象,然后通过RSAPKCS1SignatureDeformatter类来验证签名。
            //我们将得到的注册码反向转化为字节数组;并将用户名进行哈西计算得到哈西值。
            //最后通过VerifySignature进行验证。

        }

 

 


  /// RSA加密  
  public  void RSAEncrypt()
  {
   string publickey = this.txt_PublicKey.Text.Trim();
   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
   byte[] cipherbytes;
   rsa.FromXmlString(publickey);
   cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(this.tb_yaojiamishu.Text.Trim()), false);
   this.tb_jiamihoudeshu.Text= Convert.ToBase64String(cipherbytes);
  }

  /// RSA解密   
  public void RSADecrypt()
  {
   string privatekey = this.txt_PrivateKey.Text.Trim();
   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
   byte[] cipherbytes;
   rsa.FromXmlString(privatekey);
   cipherbytes = rsa.Decrypt(Convert.FromBase64String(this.tb_jiamihoudeshu.Text.Trim()), false);
   this.tb_jiemihoudeshuju.Text=Encoding.UTF8.GetString(cipherbytes);
  }

  private void bt_jiami_Click(object sender, EventArgs e)
  {
   this.RSAEncrypt();
  }

  private void bt_jimi_Click(object sender, EventArgs e)
  {
   this.RSADecrypt();
  }
    }
}

posted on 2011-11-14 13:41  旋风  阅读(1682)  评论(2)    收藏  举报

导航