程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 基於私鑰加密公鑰解密的RSA算法C#完成辦法

基於私鑰加密公鑰解密的RSA算法C#完成辦法

編輯:C#入門知識

基於私鑰加密公鑰解密的RSA算法C#完成辦法。本站提示廣大學習愛好者:(基於私鑰加密公鑰解密的RSA算法C#完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是基於私鑰加密公鑰解密的RSA算法C#完成辦法正文


本文實例講述了基於私鑰加密公鑰解密的RSA算法C#完成辦法,是一種運用非常普遍的算法。分享給年夜家供年夜家參考之用。詳細辦法以下:

1、概述

RSA算法是第一個能同時用於加密和數字簽名的算法,也易於懂得和操作。 RSA是被研討得最普遍的公鑰算法,從提出到如今已近二十年,閱歷了各類進擊的考驗,逐步為人們接收,廣泛以為是今朝最優良的公鑰計劃之一。RSA的平安性依附於年夜數的因子分化,但並沒有從實際上證實破譯RSA的難度與年夜數分化難度等價。
RSA的平安性依附於年夜數分化。公鑰和私鑰都是兩個年夜素數( 年夜於 100個十進制位)的函數。據猜想,從一個密鑰和密文揣摸出明文的難度同等於分化兩個年夜素數的積。
密鑰對的發生。選擇兩個年夜素數,p 和q 。盤算:
  n = p * q
然後隨機選擇加密密鑰e(PS:最經常使用的e值有3,17和65537,微軟就是應用的65537,采取3個中的任何一個都不存在平安成績),請求 e 和 ( p - 1 ) * ( q - 1 ) 互質。最初,應用Euclid 算法盤算解密密鑰d, 知足
  e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )
個中n和d也要互質。數e和n是公鑰,d是私鑰。兩個素數p和q不再須要,應當拋棄,不要讓任何人曉得。
加密信息 m(二進制表現)時,起首把m分紅等長數據塊 m1 ,m2,..., mi ,塊長s,個中 2^s <= n, s 盡量的年夜。對應的密文是:
        ci = mi^e ( mod n ) ( a )
解密時作以下盤算:
        mi = ci^d ( mod n ) ( b )

.NET供給經常使用的加密算法類,支撐RSA的類是RSACryptoServiceProvider(定名空間:System.Security.Cryptography),但只支撐公鑰加密,私鑰解密。RSACryptoServiceProvider類包含:Modulus、Exponent、P、Q、DP、DQ、InverseQ、D等8個屬性,個中Modulus和Exponent就是公鑰,Modulus和D就是私鑰,RSACryptoServiceProvider類供給導出公鑰的辦法,也供給導出私鑰的辦法,但導出的私鑰包括下面8個屬性,明顯要用RSACryptoServiceProvider完成私鑰加密公鑰是弗成行的。

從RSA的道理來看,公鑰加密私鑰解密和私鑰加密公鑰解密應當是等價的,在某些情形下,好比同享軟件加密,我們須要用私鑰加密注冊碼或注冊文件,發給用戶,用戶用公鑰解密注冊碼或注冊文件停止正當性驗證。

2、完成辦法

自己應用網上找的一個C#版的年夜整數類BigInteger(自己以為這是偶發明的效力最高的一個C#版年夜整數類)來完成私鑰加密公鑰加密(現實上也完整支撐公租加密私鑰解密),但沒有應用類BigInteger的年夜素數生成函數,而是直接應用類RSACryptoServiceProvider來生成年夜素數。個中加密函數息爭密函數的完成以下:

/* 
 功效:用指定的私鑰(n,d)加密指定字符串source 
*/ 
private string EncryptString(string source, BigInteger d, BigInteger n) 
{ 
 int len = source.Length; 
 int len1 = 0; 
 int blockLen = 0; 
 if ((len % 128) == 0) 
 len1 = len / 128; 
 else 
 len1 = len / 128 + 1; 
 string block = ""; 
 string temp = ""; 
 for (int i = 0; i < len1; i++) 
 { 
 if (len >= 128) 
  blockLen = 128; 
 else 
  blockLen = len; 
 block = source.Substring(i * 128, blockLen); 
 byte[] oText = System.Text.Encoding.Default.GetBytes(block); 
 BigInteger biText = new BigInteger(oText); 
 BigInteger biEnText = biText.modPow(d, n); 
 string temp1 = biEnText.ToHexString(); 
 temp += temp1; 
 len -= blockLen; 
 } 
 return temp; 
} 
/* 
 功效:用指定的公鑰(n,e)解密指定字符串source 
*/ 
private string DecryptString(string source, BigInteger e, BigInteger n) 
{ 
 int len = source.Length; 
 int len1 = 0; 
 int blockLen = 0; 
 if ((len % 256) == 0) 
 len1 = len / 256; 
 else 
 len1 = len / 256 + 1; 
 string block = ""; 
 string temp = ""; 
 for (int i = 0; i < len1; i++) 
 { 
 if (len >= 256) 
  blockLen = 256; 
 else 
  blockLen = len; 
 block = source.Substring(i * 256, blockLen); 
 BigInteger biText = new BigInteger(block, 16); 
 BigInteger biEnText = biText.modPow(e, n); 
 string temp1 = System.Text.Encoding.Default.GetString(biEnText.getBytes()); 
 temp += temp1; 
 len -= blockLen; 
 } 
 return temp; 
} 

加密進程息爭密進程代碼以下所示:

/* 
 加密進程,個中d、n是RSACryptoServiceProvider生成的D、Modulus 
*/ 
private string EncryptProcess(string source, string d, string n) 
{ 
 byte[] N = Convert.FromBase64String(n); 
 byte[] D = Convert.FromBase64String(d); 
 BigInteger biN = new BigInteger(N); 
 BigInteger biD = new BigInteger(D); 
 return EncryptString(source, biD, biN); 
} 

/* 
 解密進程,個中e、n是RSACryptoServiceProvider生成的Exponent、Modulus 
*/ 
private string DecryptProcess(string source, string e, string n) 
{ 
 byte[] N = Convert.FromBase64String(n); 
 byte[] E = Convert.FromBase64String(e); 
 BigInteger biN = new BigInteger(N); 
 BigInteger biE = new BigInteger(E); 
 return DecryptString(source, biE, biN); 
}

信任本文所述對年夜家的C#法式設計有必定的自創價值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved