最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于私鑰加密公鑰解密的RSA算法C#實(shí)現(xiàn)方法

 更新時(shí)間:2014年08月27日 11:39:54   投稿:shichen2014  
這篇文章主要介紹了基于私鑰加密公鑰解密的RSA算法C#實(shí)現(xiàn)方法,是應(yīng)用非常廣泛,需要的朋友可以參考下

本文實(shí)例講述了基于私鑰加密公鑰解密的RSA算法C#實(shí)現(xiàn)方法,是一種應(yīng)用十分廣泛的算法。分享給大家供大家參考之用。具體方法如下:

一、概述

RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。 RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。
RSA的安全性依賴于大數(shù)分解。公鑰和私鑰都是兩個(gè)大素?cái)?shù)( 大于 100個(gè)十進(jìn)制位)的函數(shù)。據(jù)猜測,從一個(gè)密鑰和密文推斷出明文的難度等同于分解兩個(gè)大素?cái)?shù)的積。
密鑰對的產(chǎn)生。選擇兩個(gè)大素?cái)?shù),p 和q 。計(jì)算:
  n = p * q
然后隨機(jī)選擇加密密鑰e(PS:最常用的e值有3,17和65537,微軟就是使用的65537,采用3個(gè)中的任何一個(gè)都不存在安全問題),要求 e 和 ( p - 1 ) * ( q - 1 ) 互質(zhì)。最后,利用Euclid 算法計(jì)算解密密鑰d, 滿足
  e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )
其中n和d也要互質(zhì)。數(shù)e和n是公鑰,d是私鑰。兩個(gè)素?cái)?shù)p和q不再需要,應(yīng)該丟棄,不要讓任何人知道。
加密信息 m(二進(jìn)制表示)時(shí),首先把m分成等長數(shù)據(jù)塊 m1 ,m2,..., mi ,塊長s,其中 2^s <= n, s 盡可能的大。對應(yīng)的密文是:
        ci = mi^e ( mod n ) ( a )
解密時(shí)作如下計(jì)算:
        mi = ci^d ( mod n ) ( b )

.NET提供常用的加密算法類,支持RSA的類是RSACryptoServiceProvider(命名空間:System.Security.Cryptography),但只支持公鑰加密,私鑰解密。RSACryptoServiceProvider類包括:Modulus、Exponent、P、Q、DP、DQ、InverseQ、D等8個(gè)屬性,其中Modulus和Exponent就是公鑰,Modulus和D就是私鑰,RSACryptoServiceProvider類提供導(dǎo)出公鑰的方法,也提供導(dǎo)出私鑰的方法,但導(dǎo)出的私鑰包含上面8個(gè)屬性,顯然要用RSACryptoServiceProvider實(shí)現(xiàn)私鑰加密公鑰是不可行的。

從RSA的原理來看,公鑰加密私鑰解密和私鑰加密公鑰解密應(yīng)該是等價(jià)的,在某些情況下,比如共享軟件加密,我們需要用私鑰加密注冊碼或注冊文件,發(fā)給用戶,用戶用公鑰解密注冊碼或注冊文件進(jìn)行合法性驗(yàn)證。

二、實(shí)現(xiàn)方法

本人利用網(wǎng)上找的一個(gè)C#版的大整數(shù)類BigInteger(本人認(rèn)為這是偶發(fā)現(xiàn)的效率最高的一個(gè)C#版大整數(shù)類)來實(shí)現(xiàn)私鑰加密公鑰加密(事實(shí)上也完全支持公租加密私鑰解密),但沒有使用類BigInteger的大素?cái)?shù)生成函數(shù),而是直接使用類RSACryptoServiceProvider來生成大素?cái)?shù)。其中加密函數(shù)和解密函數(shù)的實(shí)現(xiàn)如下:

/* 
 功能:用指定的私鑰(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#程序設(shè)計(jì)有一定的借鑒價(jià)值。

相關(guān)文章

  • 關(guān)于C#中的字體別名問題

    關(guān)于C#中的字體別名問題

    在C#中使用Graphics對象的DrawString方法繪制文本時(shí),可以通過設(shè)置TextRenderingHint屬性來控制字體混疊效果,對于14號或更大的字體,建議使用AntiAliasGridFit;對于8到14點(diǎn)之間的字體,建議使用AntiAlias;對于小于8點(diǎn)的字體,建議使用ClearTypeGridFit
    2025-01-01
  • 在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇

    在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇

    這篇文章主要介紹了在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇 的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • c#文件名/路徑處理方法示例

    c#文件名/路徑處理方法示例

    這篇文章主要介紹了c#文件名/路徑處理方法,大家寫代碼處理文件的時(shí)候會常用到
    2013-12-12
  • C++實(shí)現(xiàn)日期類的示例詳解

    C++實(shí)現(xiàn)日期類的示例詳解

    這篇文章主要為大家詳細(xì)介紹了四個(gè)C++常用的日期類的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下
    2023-02-02
  • C#數(shù)據(jù)類型實(shí)現(xiàn)背包、隊(duì)列和棧

    C#數(shù)據(jù)類型實(shí)現(xiàn)背包、隊(duì)列和棧

    本文詳細(xì)講解了C#數(shù)據(jù)結(jié)構(gòu)類型,并實(shí)現(xiàn)背包、隊(duì)列和棧的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#利用Spire.Pdf包實(shí)現(xiàn)為PDF添加數(shù)字簽名

    C#利用Spire.Pdf包實(shí)現(xiàn)為PDF添加數(shù)字簽名

    Spire.PDF for .NET 是一款專業(yè)的基于.NET平臺的PDF文檔控制組件。它能夠讓開發(fā)人員在不使用Adobe Acrobat和其他外部控件的情況下,運(yùn)用.NET 應(yīng)用程序創(chuàng)建,閱讀,編寫和操縱PDF 文檔。本文將利用其實(shí)現(xiàn)添加數(shù)字簽名,需要的可以參考一下
    2022-08-08
  • C#實(shí)現(xiàn)合并多張圖片為GIF動態(tài)圖

    C#實(shí)現(xiàn)合并多張圖片為GIF動態(tài)圖

    這篇文章主要為大家詳細(xì)介紹了C#如何將把一張又一張的圖片去拼合成一張GIF動態(tài)圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • C# UDP網(wǎng)絡(luò)通信的實(shí)現(xiàn)示例

    C# UDP網(wǎng)絡(luò)通信的實(shí)現(xiàn)示例

    UDP協(xié)議是互聯(lián)網(wǎng)上使用最廣泛的傳輸協(xié)議之一,具有簡單、高效和不可靠的特點(diǎn),本文主要介紹了C# UDP網(wǎng)絡(luò)通信的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法

    C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • C# 線程安全詳解

    C# 線程安全詳解

    這篇文章主要介紹了c# 線程安全的用法原理及使用示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09

最新評論

清镇市| 通城县| 闽清县| 鄂托克旗| 巢湖市| 连南| 得荣县| 友谊县| 宁晋县| 抚州市| 新巴尔虎右旗| 郎溪县| 广灵县| 巫山县| 永宁县| 洞口县| 墨江| 金乡县| 禄丰县| 酒泉市| 东乌珠穆沁旗| 连云港市| 界首市| 含山县| 阜新市| 子长县| 平塘县| 红原县| 婺源县| 克东县| 梨树县| 万源市| 南溪县| 浑源县| 昌乐县| 贵南县| 宜章县| 通化市| 田阳县| 阜城县| 嘉峪关市|