【密碼學】AES簡單學習

歐拉函數 html

公式python

φ(n)=(p-1)(q-1)
小於x而且和x互質的數的個數
 

相關概念算法

因數:a*b=c 那麼就稱 a、b 是 c 的因數
素數:一個數若是除了1與它自己以外沒有其餘的因數,那麼這個數就被稱爲素數(prime)
公因數:共同的因數,好比 8 和 10 的公因數是 二、1,最大公因數是 2
互質:最大公因數是 1
例如:七、3,最大公因數是 1,他們互質 gcb(7,3)=1
φ(10)=4   (1,3,7,9)
 

對於公式的解釋安全

p、q 都是素數,例如:10,p、q 分別爲 二、5,φ(10)=(p-1)(q-1)=(2-1)(5-1)=4
 

取模運算函數

若是存在正整數 m 與兩個整數 a、b,若是 a-b 能被 m 整除,那麼 a 和 b 模 m 同餘
記做:a ≡ b mod(m)
 

模指數運算工具

先進行指數運算,在進行取模運算
記做:a ≡ bⁿ mod(m)
 

python中處理函數測試

pow(x,y,z)   意思是計算x的y次方,若是z存在對結果進行取模   等效於pow(x,y)%z
 
 

歐幾里得拓展算法加密

對於不徹底爲0的非負整數a,b,gcb(a,b)表示a,b的最大公約數,必然存在x,y使得gcb(a,b)=ax+by
 
    證實:
    假設 a>b
  一、顯然當 b=0,gcd(a,b)=a,此時 x=1,y=0;
  二、ab!=0 時,設 ax1+by1=gcd(a,b);
  bx2+(a mod b)y2=gcd(b,a mod b);
  根據樸素的歐幾里德原理有 gcd(a,b)=gcd(b,a mod b);
  則:ax1+by1=bx2+(a mod b)y2;
  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
  根據恆等定理得:x1=y2; y1=x2-(a/b)*y2;
       這樣咱們就獲得了求解 x1,y1 的方法:x1,y1 的值基於 x2,y2.
 

RSA涉及的元素spa

N:大整數N,咱們稱之爲模數(modulus)
p 和 q :大整數N的兩個因子(factor) 
e 和 d:互爲模反數的兩個指數(exponent)
c 和 m:分別是密文和明文,這裏通常指的是一個十進制的數還有一個就是n的歐拉函數值,在求解d的時候經常使用
 

加密過程命令行

選擇兩個不相等的大素數p和q,這裏選61和53(實際應用中,越大越難破解)
 
計算出模數 n = p * q = 61 * 53 =3233
 
計算 φ(n) = (p−1) * (q−1) 即 n 的歐拉函數,φ(n) = 60 * 52 = 3120
 
隨機選擇一個 e 知足 (1<e<φ(n)),且 e 和 φ(n) 互質,在 1 到 3120 之間選擇,選擇了 17(實際應用中經常選擇 65537 )
 
取 e 對於 φ(n) 的模反數 d,計算方法: e * d ≡ 1 (mod φ(n)) 即:e*x+φ(n)*y = 1
17x+3120y=1,解得一組整數解爲(x,y) = (2753,-15),即 d = -15
 
將 n 和 e 封裝爲公鑰(3233,17),n 和 d 封裝爲私鑰(3233,2753)
 
對明文A進行加密:B≡A^e (mod n) 或 B = pow(A,e,n),獲得的B即爲密文
對密文B進行解密,A≡B^d( mod n) 或 A = pow(B,d,n),獲得的A即爲明文
 

RSA工具

 

RSA-tools2使用

P   第一個大素數
Q   第二個大素數  (P、Q長度不能相差太大)
E   公鑰(隨機數,必須知足:gcd(E,(p-1)*(q-1))==1)  即 E 與 (p-1)*(q-1) 互質
N   共用模數,由 P 和 Q 生成:N=P*Q
D   私鑰:D=E^(-1) mod ((p-1)*(q-1))
 

使用步驟

一、單擊「Start」按鈕,而後隨意移動鼠標直到提示信息框出現,以獲取一個隨機數種子
二、在「KeySize(Bits)」編輯框中輸入 32 ;
三、單擊「Generate」按鈕生成;
四、複製「1st Prime(P)」編輯框中的內容到「Public Exponent(E)[HEX]」編輯框;
五、再次重複第 1 步;
六、在「KeySize(Bits)」編輯框中輸入您所但願的密鑰位數,從32到4096,位數越多安全性也高,但運算速度越慢,通常選擇1024位足夠了;
七、單擊「Generate」按鈕生成;
八、單擊「Test」按鈕測試,在「Message to encrypt」編輯框中隨意輸入一段文本,而後單擊「Encrypt」按鈕加密,再單擊「Decrypt」按鈕解密,看解密後的結果是否和所輸入的一致,若是一致表示所生成的RSA密鑰可用,不然須要從新生成;
九、到今生成完成。其中:
「Private Exponent(D)」編輯框中的內容爲私鑰;E8D85AA7
「Public Exponent(E)[HEX]」編輯框中的內容爲公鑰;15E03
「Modulus (N)」編輯框中的內容爲公共模數。19F834DB9
請將上述三段十六進制文本保存起來便可。
 

大整數分解

yafu-x64.exe

 

cmd 下打開
factor(須要分解的整數)
  若是命令行不支持太長的數的話,把 N 保存在文件裏,好比:rsa.txt
  yafu-x64.exe "factor(@)" -batchfile rsa.txt
 
  eof; done processing batchfile報錯
  rsa.txt用notepad++打開,最後加上換行便可。

 

 msieve.exe

msieve.exe 0xA41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7 -v

 

msieve.exe –help 查看幫助
-v 意思打印具體分解的狀況
-q 僅僅打印能找到的因子
 

openssl

-in 選項指定待解密的數據文件msg.bin.enc 
-out 選項指定解密後的輸出文件msg.bin.dec 
-inkey 選項指定用於解密的私鑰Key.pem,因爲輸入是私鑰,因此再也不須要使用選項-pubin 
-decrypt 選項代表這裏是進行解密操做 
-pkcs 選項指定解密處理過程當中數據的填充方式,對於填充,可選項有:-pkcs, -oaep, -ssl, -raw,默認是-pkcs,即按照PKCS#1 v1.5規範進行填充
 
openssl genrsa -out key.pem -f4 2048 生成私鑰,並導出公鑰生成2048 bit的PEM格式的RSA Key:Key.pem openssl rsa -in key.pem -pubout -out key_public.pem 從私鑰導出公鑰:Key_public.pem echo "hello rsa" > msg.txt 爲了簡便起見,這裏將字符串」hello rsa」存放到文件msg.txt做爲測試數據 openssl rsautl -in msg.txt -out msg.txt.enc -inkey key_public.pem -pubin -encrypt -pkcs 使用公鑰key_public.pem對測試數據msg.txt進行加密生成msg.txt.enc openssl rsautl -in msg.txt.enc -out msg.txt.dec -inkey key.pem -decrypt -pkcs 使用私鑰key.pem對加密後的數據msg.txt.enc進行解密,並將結果存放到msg.txt.dec文件中

 

例子

實驗吧 RSA

 

http://ctf5.shiyanbar.com/crypto/RSA
 
openssl rsa -pubin -text -modulus -in public.pem 

 

分析公鑰獲得 N 、E
Exponent(E)= 65537 (0x10001)
Modulus(N)= A41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7
 
分解大整數
msieve.exe 0xA41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7 -v
 
 
獲得:
p39 factor: 258631601377848992211685134376492365269
p39 factor: 286924040788547268861394901519826758027
 

使用 python 腳本解密 rsa.py,用到的庫 win10 上沒裝好,在 kali 裏能夠,用 kali 運行 python2 rsa.py 獲得私鑰 private.pem

import math import sys from Crypto.PublicKey import RSA keypair = RSA.generate(1024) keypair.p=258631601377848992211685134376492365269 keypair.q=286924040788547268861394901519826758027 keypair.e=65537 keypair.n=keypair.p * keypair.q Qn = long((keypair.p-1) * (keypair.q-1)) i =1
while(True): x=(Qn * i) + 1
    if(x%keypair.e==0): keypair.d=x/keypair.e break i+=1 private=open('private.pem','w') private.write(keypair.exportKey()) private.close()

 

 
解密文件,獲得 flag
openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt 
 
 

 參考

https://www.freebuf.com/sectool/163781.html 
安全牛課程《CTF從入門到提高》
相關文章
相關標籤/搜索