ASP.NET RSA 加密

相信RSA加密大家都不陌生,MD5加密虽然也是一种加密手段,但是MD5加密是单向加密,不可以解密,在某些场合下显得非常不方便,所以今天特地MSDN上找了个例子来认识RSA加密。

1.首先是前端代码

   1:     <table >
   2:              <tr>
   3:                  <td>
   4:                      <asp:Label  runat="server" Text="Enter Some Words:"></asp:Label>
   5:                  </td>
   6:                  <td colspan="3">
   7:                      <asp:TextBox  runat="server" Width="300px"></asp:TextBox>
   8:                  </td>
   9:              </tr>
  10:              <tr>
  11:                  <td>
  12:                      <asp:Label  runat="server" Text="Encrypted Data:"></asp:Label>
  13:                  </td>
  14:                  <td>
  15:                      <asp:Button  runat="server" Text="Encrypt it" OnClick="Encrypt_Click"
  16:                          Height="30px" Width="90px" />
  17:                      <br />
  18:                      <asp:TextBox  runat="server" TextMode="MultiLine" Height="200px"
  19:                          Width="400px" ReadOnly="true"></asp:TextBox>
  20:                      <br />
  21:                  </td>
  22:                  <td>
  23:                      <asp:Label  runat="server" Text="Decrypted Data:"></asp:Label>
  24:                  </td>
  25:                  <td>
  26:                      <asp:Button  runat="server" Text="Decrypt it" OnClick="Decrypt_Click"
  27:                          Height="30px" Width="90px" />
  28:                      <br />
  29:                      <asp:TextBox  runat="server" TextMode="MultiLine" Height="200px"
  30:                          Width="400px" ReadOnly="true"></asp:TextBox>
  31:                      <br />
  32:                  </td>
  33:              </tr>
  34:          </table>

2.后台代码

说明:因为是初次接触RSA加密再加上C#基础不是很好,看起来还是非常费劲,所以加了许多注释。可以单独把加密和解写到一个类里面,到时候方便调用,但是如果是想用来加密密码或是用户名之类的,那应该在设计时留足足够的长度。

   1:   protected void Page_Load(object sender, EventArgs e)
   2:          {
   3:              AddKeyUpEventOnTextControl();
   4:              //1.PreRender 在加载 System.Web.UI.Control 对象之后、呈现之前发生。
   5:              //2.将 btn.Decrypt控件的PreRender事件绑定到名为btnDecrypt_PreRender 的方法(动态绑定)
   6:              this.btnDecrypt.PreRender += new EventHandler(btnDecrypt_PreRender);
   7:              this.btnEncrypt.PreRender += new EventHandler(btnEncrypt_PreRender);
   8:          }
   9:   
  10:          private void RSAEncryption()
  11:          {
  12:   
  13:              //3.CspParameters包含传递给执行加密计算的加密服务提供程序 (CSP) 的参数。无法继承此类。
  14:              CspParameters param = new CspParameters();
  15:              //4. KeyContainerName 表示 System.Security.Cryptography.CspParameters 的密钥容器名称。
  16:              param.KeyContainerName = "MyKeyContainer";
  17:              //5.  使用加密服务提供程序 (CSP) 提供的 System.Security.Cryptography.RSA 算法的实现执行不对称加密和解密
  18:              using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
  19:              {
  20:                  string plaintext = this.tbData.Text;
  21:                  byte[] plaindata = System.Text.Encoding.Default.GetBytes(plaintext);
  22:              //6. 如果为 true,则使用 OAEP 填充(仅在运行 Microsoft Windows XP 或更高版本的计算机上可用)执行直接的
  23:              //System.Security.Cryptography.RSA 加密;否则,如果为 false,则使用 PKCS#1 1.5 版填充。
  24:                  byte[] encryptdata = rsa.Encrypt(plaindata, false);
  25:              // 7.将 8 位无符号整数的数组转换为其用 Base64 数字编码的等效字符串表示形式
  26:                  string encryptstring = Convert.ToBase64String(encryptdata);//加密后长度为128
  27:                  this.tbEncryptData.Text = encryptstring;
  28:              }
  29:          }
  30:   
  31:          private void RSADecryption()
  32:          {
  33:              CspParameters param = new CspParameters();
  34:              param.KeyContainerName = "MyKeyContainer";
  35:              using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
  36:              {
  37:                  //8.将指定的字符串(它将二进制数据编码为 Base64 数字)转换为等效的 8 位无符号整数数组
  38:                  byte[] encryptdata = Convert.FromBase64String(this.tbEncryptData.Text);
  39:                  //9.使用 System.Security.Cryptography.RSA 算法对数据进行解密。
  40:                  byte[] decryptdata = rsa.Decrypt(encryptdata, false);
  41:                  string plaindata = System.Text.Encoding.Default.GetString(decryptdata);
  42:                  this.tbDecryptData.Text = plaindata;
  43:              }
  44:          }
  45:   
  46:          protected void Encrypt_Click(object sender, EventArgs e)
  47:          {
  48:              RSAEncryption();
  49:          }
  50:   
  51:          protected void Decrypt_Click(object sender, EventArgs e)
  52:          {
  53:              RSADecryption();
  54:          }
  55:   
  56:          void btnDecrypt_PreRender(object sender, EventArgs e)
  57:          {
  58:              EnableDecryptButton();
  59:          }
  60:   
  61:          void btnEncrypt_PreRender(object sender, EventArgs e)
  62:          {
  63:              EnableEncryptButton();
  64:          }
  65:   
  66:          private void AddKeyUpEventOnTextControl()
  67:          {
  68:              string script = string.Format(@"function PressFn(sender) {{
  69:                                              document.getElementById('{0}').disabled = sender.value == '' ? true : false;
  70:                                              }}", btnEncrypt.ClientID);
  71:              tbData.Attributes["onkeyup"] = "PressFn(this)";
  72:              Page.ClientScript.RegisterStartupScript(this.GetType(), "DataKeyUp", script, true);
  73:          }
  74:   
  75:          /// <summary>
  76:          /// 动态设置加密按钮是否可用
  77:          /// </summary>
  78:          private void EnableDecryptButton()
  79:          {
  80:              btnDecrypt.Enabled = this.tbEncryptData.Text != string.Empty ? true : false;
  81:             //大概以前都不会想到用这种想法,如果是我我会用if...else...
  82:          }
  83:   
  84:          /// <summary>
  85:          /// 动态设置解密按钮是否可用
  86:          /// </summary>
  87:          private void EnableEncryptButton()
  88:          {
  89:              btnEncrypt.Enabled = this.tbData.Text != string.Empty ? true : false;
  90:          }