rsa加密是什么?
rsa加密是一種非對稱的加密算法,就是加密秘鑰和解密秘鑰是不同的。用公鑰進行加密,私鑰進行解密。
加密:公鑰 (e,n) 計算
解密:私鑰(d,n)計算
python怎么進行加密?
從上面的圖中可以知道,A對明文進行加密,需使用到B發送給A的公鑰,那就先要獲取到公鑰。(公鑰(e,n):e (Exponent)--指數;n(Modulus)—模數)
① 抓包看第一個請求的響應結果:有看到2個參數Exponent、Modulus。
但是這兩個值都是字符串,我們需要的是兩個整數。故要對它先進行轉換。
② 字符串轉換成十進制
import
base64
import
binascii
e_str=base64.b64decode(
'AQAB'
) #返回解碼后的二進制數據(文本字符串轉換成二進制數據)
m_str=base64.b64decode(
'AJONEgY58nD12OcAXv7P9UGPPsZOGLKj/IQjPf+gzyujHmXZoe3lFN1/PgxaqttzAAlC6DXgumvnyfjXc8csfkJz2oyaQiPMS2+TGipdZ1M3Rm1NlNO2K9yq8VeLFgZUhNCJTkS8RNoQ9pWT7EsAPGYINqmNh329Ltp/7JK7kyyl'
)
print(m_str)
print(e_str)
m_hex = binascii.b2a_hex(m_str) #返回二進制數據的十六進制表示(二進制轉換成十六進制)
e_hex = binascii.b2a_hex(e_str)
print(m_hex)
print(e_hex)
e=
int
(e_hex,
16
) # 將
16
進制大端格式字符串轉換為大整數(十六進制轉換成十進制)
n=
int
(m_hex,
16
)
print(e)
print(n)
|
1)Base64是一種用64個字符來表示任意二進制數據的方法。是一種最常見的二進制編碼方法
方法 |
說明 |
|
---|---|---|
base64.b64encode(data) |
編碼:二進制轉換成文本字符串 |
|
base64.b64decode(string) |
解碼:文本字符串轉換成二進制 |
2) binascii模塊包含很多用來方法來轉換二進制和各種ASCII編碼的二進制表示法。binascii二進制和ASCII轉換
方法 |
說明 |
|
---|---|---|
binascii.a2b_base64(string) |
轉換的base64數據塊為二進制,並返回二進制數據。一次可以傳遞多行。 |
和base64.b64decode對應。 |
binascii.b2a_base64(data) |
轉換二進制數據為一行base64編碼的ASCII字符。返回字符串包含換行符。根據base64的標准data的長度最大為57。 |
和base64.b64encode對應。 |
binascii.b2a_hex(data)和binascii.hexlify(data) |
返回二進制數據的十六進制表示。每個字節被轉換成相應的2位十六進制表示形式。因此,得到的字符串是是原數據長度的兩倍。 |
|
binascii.a2b_hex(hexstr)和binascii.unhexlify(hexstr) |
從十六進制字符串hexstr返回二進制數據。是b2a_hex的逆向操作。 hexstr必須包含偶數個十六進制數字(可以是大寫或小寫),否則報TypeError。 |
3)int轉換成整數 int(x, base=10)
-
x -- 字符串或數字。
-
base -- 進制數,默認十進制。
int(x)–不傳入base,x必須是數字int(x,base=16)–x是字符串形式,是16進制表達式(16進制轉換成2進制)
③ 獲取到模數和指數后,生成公鑰進行加密
from cryptography.hazmat.primitives.asymmetric
import
rsa,padding
from cryptography.hazmat.backends
import
default_backend
pubkey=rsa.RSAPublicNumbers(e,n).public_key(default_backend())
print(pubkey)
key = pubkey.encrypt(
'abc12345'
.encode(
'utf-8'
),padding.PKCS1v15()) #使用公鑰對明文“abc12345”加密,返回加密后的二進制數據
print(key)
print(binascii.b2a_base64(key)) #加密后的二進制轉換成 字符串
|