RSA演算法基礎->實踐
RSA演算法基礎->實踐 |
---|
作者:watercloud [at] xfocus.org xfocus (2005-04-29 12:52:55) |
講講自己學習RSA中的實踐過程,已經對RSA熟悉的看家就不用在此浪費時間了。 <一>基礎 RSA演算法非常簡單,概述如下: 找兩素數p和q 取n=p*q 取t=(p-1)*(q-1) 取任何一個數e,要求滿足e<t並且e與t互素(就是最大公因數為1) 取d*e%t==1 這樣最終得到三個數: n d e 設訊息為數M (M <n) 設c=(M**d)%n就得到了加密後的訊息c 設m=(c**e)%n則 m == M,從而完成對c的解密。 注:**表示次方,上面兩式中的d和e可以互換。 在對稱加密中: n d兩個數構成公鑰,可以告訴別人; n e兩個數構成私鑰,e自己保留,不讓任何人知道。 給別人傳送的資訊使用e加密,只要別人能用d解開就證明資訊是由你傳送的,構成了簽名機制。 別人給你傳送資訊時使用d加密,這樣只有擁有e的你能夠對其解密。 rsa的安全性在於對於一個大數n,沒有有效的方法能夠將其分解 從而在已知n d的情況下無法獲得e;同樣在已知n e的情況下無法 求得d。 <二>實踐 接下來我們來一個實踐,看看實際的操作: 找兩個素數: p=47 q=59 這樣 n=p*q=2773 t=(p-1)*(q-1)=2668 取e=63,滿足e<t並且e和t互素 用perl簡單窮舉可以獲得滿主 e*d%t ==1的數d: C:/Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }" 847 即d=847 最終我們獲得關鍵的 n=2773 d=847 e=63 取訊息M=244我們看看 加密: c=M**d%n = 244**847%2773 用perl的大數計算來算一下: C:/Temp>perl -Mbigint -e "print 244**847%2773" 465 即用d對M加密後獲得加密資訊c=465 解密: 我們可以用e來對加密後的c進行解密,還原M: m=c**e%n=465**63%2773 : C:/Temp>perl -Mbigint -e "print 465**63%2773" 244 即用e對c解密後獲得m=244 , 該值和原始資訊M相等。 <三>字串加密 把上面的過程整合一下我們就能實現一個對字串加密解密的示例了。 每次取字串中的一個字元的ascii值作為M進行計算,其輸出為加密後16進位制 的數的字串形式,按3位元組表示,如01F 程式碼如下: #!/usr/bin/perl -w #RSA 計算過程學習程式編寫的測試程式 #watercloud 2003-8-12 # use strict; use Math::BigInt; my %RSA_CORE = (n=>2773,e=>63,d=>847); #p=47,q=59 my $N=new Math::BigInt($RSA_CORE{n}); my $E=new Math::BigInt($RSA_CORE{e}); my $D=new Math::BigInt($RSA_CORE{d}); print "N=$N D=$D E=$E/n"; sub RSA_ENCRYPT { my $r_mess = shift @_; my ($c,$i,$M,$C,$cmess); for($i=0;$i < length($$r_mess);$i++) { $c=ord(substr($$r_mess,$i,1)); $M=Math::BigInt->new($c); $C=$M->copy(); $C->bmodpow($D,$N); $c=sprintf "%03X",$C; $cmess.=$c; } return /$cmess; } sub RSA_DECRYPT { my $r_mess = shift @_; my ($c,$i,$M,$C,$dmess); for($i=0;$i < length($$r_mess);$i+=3) { $c=substr($$r_mess,$i,3); $c=hex($c); $M=Math::BigInt->new($c); $C=$M->copy(); $C->bmodpow($E,$N); $c=chr($C); $dmess.=$c; } return /$dmess; } my $mess="RSA 娃哈哈哈~~~"; $mess=$ARGV[0] if @ARGV >= 1; print "原始串:",$mess,"/n"; my $r_cmess = RSA_ENCRYPT(/$mess); print "加密串:",$$r_cmess,"/n"; my $r_dmess = RSA_DECRYPT($r_cmess); print "解密串:",$$r_dmess,"/n"; #EOF 測試一下: C:/Temp>perl rsa-test.pl N=2773 D=847 E=63 原始串:RSA 娃哈哈哈~~~ 加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4 解密串:RSA 娃哈哈哈~~~ C:/Temp>perl rsa-test.pl 安全焦點(xfocus) N=2773 D=847 E=63 原始串:安全焦點(xfocus) 加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B 解密串:安全焦點(xfocus) <四>提高 前面已經提到,rsa的安全來源於n足夠大,我們測試中使用的n是非常小的,根本不能保障安全性, 我們可以通過RSAKit、RSATool之類的工具獲得足夠大的N 及D E。 通過工具,我們獲得1024位的N及D E來測試一下: n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005D BDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B 47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2 BC511951 d=0x10001 e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C2995 4C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2 C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B 1965 設原始資訊 M=0x11111111111122222222222233333333333 完成這麼大數字的計算依賴於大數運算庫,用perl來運算非常簡單: A) 用d對M進行加密如下: c=M**d%n : C:/Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x11111111111122222222222233 333333333, 0x10001, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5F CD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F0 17F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD6 0438941D2ED173CCA50E114705D7E2BC511951);print $x->as_hex" 0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd 45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b 3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91 f1834580c3f6d90898 即用d對M加密後資訊為: c=0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd 45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b 3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91 f1834580c3f6d90898 B) 用e對c進行解密如下: m=c**e%n : C:/Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab 681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3 866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb4764414 65f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898, 0xE760A 3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D 86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF 2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A 592D2B1965, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90 B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF 1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941 D2ED173CCA50E114705D7E2BC511951);print $x->as_hex" 0x11111111111122222222222233333333333 (我的P4 1.6G的機器上計算了約5秒鐘) 得到用e解密後的m=0x11111111111122222222222233333333333 == M C) RSA通常的實現 RSA簡潔幽雅,但計算速度比較慢,通常加密中並不是直接使用RSA 來對所有的資訊進行加密, 最常見的情況是隨機產生一個對稱加密的金鑰,然後使用對稱加密演算法對資訊加密,之後用 RSA對剛才的加密金鑰進行加密。 最後需要說明的是,當前小於1024位的N已經被證明是不安全的 自己使用中不要使用小於1024位的RSA,最好使用2048位的。 原文連結:http://www.xfocus.net/articles/200503/778.html |
相關文章
- RSA演算法以及數學基礎演算法
- GraphQL 基礎實踐
- 實踐證明了基礎!
- Redux 基礎與實踐Redux
- MySQL基礎語法實踐MySql
- React 應用實踐(基礎篇)React
- RSA演算法與Python實現演算法Python
- Java實現AES和RSA演算法Java演算法
- RSA演算法演算法
- Kotlin 基礎學習+快速實踐Kotlin
- 專案管理基礎與實踐(4)專案管理
- 專案管理基礎與實踐(5)專案管理
- 專案管理基礎與實踐(3)專案管理
- 專案管理基礎與實踐(2)專案管理
- 專案管理基礎與實踐(1)專案管理
- 基礎夯實:基礎資料結構與演算法(一)資料結構演算法
- C#基於RSA加密演算法實現軟體註冊實戰演練C#加密演算法
- Netty基礎招式——ChannelHandler的最佳實踐Netty
- WebRTC基礎實踐-1.WebRTC簡介Web
- Java Web基礎 --- Servlet 綜述(實踐篇)JavaWebServlet
- RSA加密演算法加密演算法
- RSA演算法原理演算法
- RSA演算法(一)演算法
- 解析Monte-Carlo演算法(基本原理,理論基礎,應用實踐)演算法
- 基於MD5+RSA演算法實現介面呼叫防扯皮級鑑權演算法
- 基礎演算法演算法
- 演算法基礎演算法
- 在SQL SERVER中實現RSA加密演算法SQLServer加密演算法
- DevOps基礎的認識與工具實踐dev
- 多執行緒基礎練習實踐篇執行緒
- 配運基礎資料快取瘦身實踐快取
- 探索機器學習:從基礎概念到應用實踐機器學習
- 夯實基礎:排序演算法之堆排序排序演算法
- RSA演算法簡介演算法
- RSA演算法詳解演算法
- RSA演算法原理(二)演算法
- RSA演算法原理(一)演算法
- [轉載]RSA演算法演算法