什么是RSA


一、RSA引入:

RSA是什么,嗯,這是一個好問題,有沒有興趣啊

二、RSA的解釋:

RSA是一種加密方式,它是現代密碼學的代表(什么是現代密碼學,這個嗎,我感覺就是我們所使用的密碼的加密的方式之一可以這么理解)

那么到底什么是RSA,就叫我來給大家說一下吧

RSA加密算法是一種非對稱加密算法,所謂非對稱,就是指該算法加密和解密使用不同的密鑰,即使用加密密鑰進行加密、解密密鑰進行解密。

在RSA算法中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。

如果此時我們有一個極大整數做因數分解的難度決定了RSA算法的可靠性。理論上,只要其鑰匙的長度n足夠長,用RSA加密的信息實際上是不能被解破的。

RSA算法通常是先生成一對RSA密鑰,其中之一是保密密鑰,由用戶保存;

另一個為公開密鑰,可對外公開。

三、RSA的基礎數學概念(知識儲備),附python的代碼表示

1、互斥的概念

  1、任意兩個質數構成互質關系,比如13和61

  2、一個數是質數,另一個數只要不是前者的倍數,兩者就構成互質關系,比如3和10

  3、如果兩個數之中,較大的那個數是質數,則兩者構成互質關系,比如97和57

  4、p是大於1的奇數,則p和p-2構成互質關系,比如27和25

  5、p是大於1的整數,則p和p-1構成互質關系,比如53和52

  6、1和任意一個自然數是都是互質關系,比如1和99

將一個大的因數分解成2個質數,可以用以下的代碼進行驗證運行檢驗:

a=int(input())
for b in range(100):
    for c in range(b,100):
        if b%2!=0 and c%2!=0:
            if b*c == a :
                     print(b,c)
#b,c的值可以換,不過要考慮運行時間的問題,也可以使用在線網站進行解密

在線網站的網址:http://www.jsons.cn/quality/

2、歐拉函數

      1、特殊的, φ(1)=1

  2、如果n是質數,則 φ(n)=n-1 。因為質數與小於它的每一個數,都構成互質關系。比如5與1、2、3、4都構成互質關系。

  3、如果n是質數的某一個次方,即 n = p^k (p為質數,k為大於等於1的整數),則

  比如 φ(8) = φ(2^3) =2^3 – 2^2 = 8-4 = 4。

代碼表示:

歐拉函數
import math
a=int(input())
for b in range(10):
    for c in range(10):
        if a == math.pow(b,c):
            print(b,c)
            d = math.pow(b,c)-math.pow(b,c-1)
            print(d)

  4、如果n可以分解成兩個互質的整數之積,即 n=p1×p2,則 φ(n)=φ(p1p2)=φ(p1)×φ(p2)

代碼表示:

# 證明n=p1×p2與φ(n)=φ(p1p2)=φ(p1)×φ(p2)相同
import math
n=int(input())
p1=int(input())
p2=int(input())
def hs(w):
    for b in range(10):
        for c in range(10):
            if w == math.pow(b,c):
                d = math.pow(b,c)-math.pow(b,c-1)
                print(d)

3、歐拉定理

歐拉定理是RSA算法的核心

這個式子的含義為:a的φ(n)次方除以n的余數為1

代碼表示:

歐拉定理
import math
a=int(input())
n=int(input())
for b in range(100):
    for c in range(b,100):
        if n == math.pow(b,c):
            print(b,c)
            d = math.pow(b,c)-math.pow(b,c-1)
            print(d)
            if pow(a,d)%n==1:
                print("顯示正確")
            else:
                print("報錯")

4、模反函數

如果兩個正整數a和n互質,那么一定可以找到整數b(不一定唯一),使得 ab-1 被n整除,或者說ab除以n的余數是1。

ab≡1(mod n), 這時,b就叫做a的“乘法逆元(乘法模反元素)”

比如,5和17互質,那么7就是5的模反元素,同時24、41、58...都是5的模反元素,即如果b是a的模反元素,則 b+kn 都是 a的模反元素

代碼表示:

模反元素
a=int(input())
for b in range(100):
    for c in range(b,100):
        if b%2!=0 and c%2!=0:
            if b*c == a :
                for n in range(100):
                    if (b*n)%c==1:
                        print(b,c)
                        print(n)
如果已經知道兩個質數:
a,b=map(int,input().split())
# a=int(input())
# b=int(input())
for n in range(100):
    if (a*n) % b == 1:
        print(a,b)
        print(n)

5、明文and密文

  1、明文(Plain Text):明文,是指沒有加密的文字(或者字符串),屬於密碼學術語。

  2、密文(Cipher Text):密文是加了密的的文字。明文是加密之前的文字。

  3、密文是對明文進行加密后的報文。

四、RSA四大基本公式

 

 

 

RSA小結(根據以上4個公式的小結)

公鑰 (E,N)
私鑰

(D,N)

密鑰對 (E,D,N)
加密 密文=明文EmodN密文=明文EmodN
解密 明文=密文DmodN明文=密文DmodN


RSA我認為的重點:

求p,q,n,e,d,一般情況是已知p,q,e求n,d 這個是我認為最重要的

怎么求:

(1)隨機選擇兩個不相等的質數p和q
我們選擇61和53,在實際應用中,這兩個質數越大就越難破解。

(2)計算p和q的乘積n
n=61*53=3233
3233寫成二進制是110010100001共12位,故該密鑰是12位的,目前主流可選值:1024、2048、3072、4096...低於1024bit的密鑰已經不建議使用(安全問題)。

(3)計算n的歐拉函數φ(n)
因為n = p*q,由歐拉函數的小性質 ,
如果n=p×q且p、q互質,則φ(n)=φ(pq)=φ(p)φ(q)。
由於我們的p和q都是質數,再一次由歐拉函數的小性質 如果n是質數,則φ(n)=n-1,可得 φ(p)=p-1 , φ(q)=q-1。所以我們的 φ(n)=(p-1)(q-1)
所以我們例子中的 φ(n)=60×52=3120。

(4)按照條件隨機選擇一個整數e
選擇e的條件是 1<e<φ(n),且e與φ(n)互質。
本例中選取e = 17,但實際應用中e常常取65537 。

(5)計算e對於φ(n)的模反元素d
根據歐拉定理我們有: ed≡1(modφ(n))
即 ed–kφ(n)=1
將 e=17, φ(n)=3120代入可得:
17d–3120k=1
這里我們采用拓展歐幾里得算法求解d的值。
拓展歐幾里得算法可用來求解線性同余方程 a?x≡c(modb)且c=1的情況。我們可以把該方程轉換成 a?x+b?y=1這種形式。
e = 17; 滿足1< e < φ(n),且e與φ(n) 互質。
d = 2753;e對於φ(n)的模反元素d。
所以我們的公鑰就是 (n,e)=(3233,17),私鑰就是 (n,d)=(3233,2753)

RSA例題:

題目來源:buuctf crypto rsa

rsa(現代密碼學,題目來源buuuctf rsa):
這個題已知p,q,e求d,所以d的值就是flag,我們運用數學方法求d
p=473398607161(題目已知)
q=4511491(題目已知)
n=2,135,733,555,619,387,051(P*Q)
L=2,135,733,082,216,268,400((p-1)*(q-1))
e=17(題目已知)
ed=1(mod L)
17d=1 (mod 2,135,733,082,216,268,400)
17d-2,135,733,082,216,268,400k=1
k=1,整除,k為整數(1<k<L)
d為整數,k的值經過嘗試,使d的值是一個整數無余數
d=125631357777427553
所以這個題的flag就是flag{125631357777427553}

這個程序相對應的腳本:

p=int(input())
q=int(input())
e=int(input())
for k in range(100):
    a = p-1
    b = q-1
    c = a*b
    d = (c*k+1)/e
    if d%1 == 0 :
        print(k)
        print((c*k+1)//e)
        break

可以根據這個題解決這個問題

RSA例題2,含有公鑰和私鑰的問題如何解決

題目來源:buuctf crypto rsarsa

相對應的腳本:

import gmpy2
p=int(input())
q=int(input())
e=int(input())
# c=int(input())
# m=int(input())
d=gmpy2.invert(e,(p-1)*(q-1))
print(d)
# m=pow(c,d,p*q)
# c=pow(m,e,p*q)
print(m)

注:m是加密,c是解密,可以自己嘗試一下

有關RSA基礎的東西到這就介紹了,下周在更新RSA的更多知識

小白一個,希望大佬多多指點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM