常見加密方式和Python實現(xiàn)

本文地址:http://www.reibang.com/p/4ba20afacce2


1. 前言

我們所說的加密方式狠毯,都是對二進制編碼的格式進行加密的,對應(yīng)到Python中,則是我們的Bytes

所以當我們在Python中進行加密操作的時候,要確保我們操作的是Bytes踏烙,否則就會報錯。

將字符串和Bytes互相轉(zhuǎn)換可以使用encode()decode()方法历等。如下所示:

# 方法中不傳參數(shù)則是以默認的utf-8編碼進行轉(zhuǎn)換
In [1]: '南北'.encode()
Out[1]: b'\xe5\x8d\x97\xe5\x8c\x97'

In [2]: b'\xe5\x8d\x97\xe5\x8c\x97'.decode()
Out[2]: '南北'

注:兩位十六進制常常用來顯示一個二進制字節(jié)讨惩。

利用binascii模塊可以將十六進制顯示的字節(jié)轉(zhuǎn)換成我們在加解密中更常用的顯示方式:

In [1]: import binascii

In [2]: '南北'.encode()
Out[2]: b'\xe5\x8d\x97\xe5\x8c\x97'

In [3]: binascii.b2a_hex('南北'.encode())
Out[3]: b'e58d97e58c97'

In [4]: binascii.a2b_hex(b'e58d97e58c97')
Out[4]: b'\xe5\x8d\x97\xe5\x8c\x97'

In [5]: binascii.a2b_hex(b'e58d97e58c97').decode()
Out[5]: '南北'

2. URL編碼

正常的URL中是只能包含ASCII字符的,也就是字符寒屯、數(shù)字和一些符號荐捻。而URL編碼就是一種瀏覽器用來避免url中出現(xiàn)特殊字符(如漢字)的編碼方式。

其實就是將超出ASCII范圍的字符轉(zhuǎn)換成帶%的十六進制格式寡夹。

例子

In [1]: from urllib import parse

# quote()方法會自動將str轉(zhuǎn)換成bytes处面,所以這里傳入str和bytes都可以
In [2]: parse.quote('南北')
Out[2]: '%E5%8D%97%E5%8C%97'

In [3]: parse.unquote('%E5%8D%97%E5%8C%97')
Out[3]: '南北'

3. Base64編碼

Base64是一種用64個字符來表示任意二進制數(shù)據(jù)的方法。

Base64編碼可以稱為密碼學的基石菩掏』杲牵可以將任意的二進制數(shù)據(jù)進行Base64編碼。所有的數(shù)據(jù)都能被編碼為并只用65個字符就能表示的文本文件智绸。( 65字符:A~Z a~z 0~9 + / = )編碼后的數(shù)據(jù)~=編碼前數(shù)據(jù)的4/3野揪,會大1/3左右访忿。

3.1. 原理

image.png
  1. 將所有字符轉(zhuǎn)化為ASCII碼。
  2. 將ASCII碼轉(zhuǎn)化為8位二進制 斯稳。
  3. 將二進制3個歸成一組(不足3個在后邊補0)共24位海铆,再拆分成4組,每組6位挣惰。
  4. 統(tǒng)一在6位二進制前補兩個0湊足8位游添。
  5. 將補0后的二進制轉(zhuǎn)為十進制。
  6. 從Base64編碼表獲取十進制對應(yīng)的Base64編碼通熄。

3.2. 說明

  1. 轉(zhuǎn)換的時候,將三個byte的數(shù)據(jù)找都,先后放入一個24bit的緩沖區(qū)中唇辨,先來的byte占高位。
  2. 數(shù)據(jù)不足3byte的話能耻,于緩沖區(qū)中剩下的bit用0補足赏枚。然后,每次取出6個bit晓猛,按照其值選擇查表選擇對應(yīng)的字符作為編碼后的輸出饿幅。
  3. 不斷進行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成戒职。
  4. 如果最后剩下兩個輸入數(shù)據(jù)栗恩,在編碼結(jié)果后加1個“=”。
  5. 如果最后剩下一個輸入數(shù)據(jù)洪燥,編碼結(jié)果后加2個“=”磕秤。
  6. 如果沒有剩下任何數(shù)據(jù),就什么都不要加捧韵,這樣才可以保證資料還原的正確性市咆。

3.3. python使用

Python內(nèi)置的base64模塊可以直接進行base64的編解碼

注意:用于base64編碼的,要么是ASCII包含的字符再来,要么是二進制數(shù)據(jù)

In [1]: import base64

In [2]: base64.b64encode(b'hello world')
Out[2]: b'aGVsbG8gd29ybGQ='

In [3]: base64.b64decode(b'aGVsbG8gd29ybGQ=')
Out[3]: b'hello world'

4. MD5(信息-摘要算法)

message-digest algorithm 5(信息-摘要算法)蒙兰。經(jīng)常說的“MD5加密”,就是信息摘要算法芒篷。

md5搜变,其實就是一種算法∷蠓ィ可以將一個字符串痹雅,或文件,或壓縮包糊识,執(zhí)行md5后绩社,就可以生成一個固定長度為128bit的串摔蓝。這個串,基本上是唯一的愉耙。

4.1. 特點

  1. 壓縮性:任意長度的數(shù)據(jù)贮尉,算出的MD5值長度都是固定的。
  2. 容易計算:從原數(shù)據(jù)計算出MD5值很容易朴沿。
  3. 抗修改性:對原數(shù)據(jù)進行任何改動猜谚,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別赌渣。
  4. 強抗碰撞:已知原數(shù)據(jù)和其MD5值魏铅,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
  5. 不可逆性:每個人都有不同的指紋坚芜,看到這個人览芳,可以得出他的指紋等信息,并且唯一對應(yīng)鸿竖,但你只看一個指紋沧竟,是不可能看到或讀到這個人的長相或身份等信息。

舉個栗子:世界上只有一個我缚忧,但是但是妞卻是非常非常多的悟泵,以一個有限的我對幾乎是無限的妞,所以可能能搞定非常多(100+)的妞闪水,這個理論上的確是通的糕非,可是實際情況下....

4.2. python使用

由于MD5模塊在python3中被移除,在python3中使用hashlib模塊進行md5操作

import hashlib

# 待加密信息
str = '這是一個測試'

# 創(chuàng)建md5對象
hl = hashlib.md5()

# 此處必須聲明encode
# 若寫法為hl.update(str)  報錯為: Unicode-objects must be encoded before hashing
hl.update(str.encode(encoding='utf-8'))

print('MD5加密前為 :' + str)
print('MD5加密后為 :' + hl.hexdigest())

運行結(jié)果

MD5加密前為 :這是一個測試
MD5加密后為 :cfca700b9e09cf664f3ae80733274d9f

md5的長度敦第,默認為128bit峰弹,也就是128個0和1的二進制串。這樣表達是很不友好的芜果。所以將二進制轉(zhuǎn)成了16進制鞠呈,每4個bit表示一個16進制,所以128/4 = 32 換成16進制表示后右钾,為32位了蚁吝。

為什么網(wǎng)上還有md5是16位的呢?

其實16位的長度舀射,是從32位md5值來的窘茁。是將32位md5去掉前八位,去掉后八位得到的山林。


5. Python加密庫PyCryptodome

PyCrypto是 Python 中密碼學方面最有名的第三方軟件包桑孩,提供了許多加密算法的使用⌒海可惜的是温数,它的開發(fā)工作于2012年就已停止。

幸運的是域那,有一個該項目的分支PyCrytodome 取代了 PyCrypto 败许。

5.1. 安裝與導(dǎo)入

安裝之前需要先安裝Microsoft Visual c++ 2015市殷。

在Linux上安裝,可以使用以下 pip 命令:

pip install pycryptodome

導(dǎo)入:

import Crypto

在Windows 系統(tǒng)上安裝則稍有不同:

pip install pycryptodomex

導(dǎo)入:

import Cryptodome

6. DES

DES算法為密碼體制中的對稱密碼體制音羞,又被稱為美國數(shù)據(jù)加密標準。

DES是一個分組加密算法,典型的DES以64位為分組對數(shù)據(jù)加密财边,加密和解密用的是同一個算法黑滴。

DES算法的入口參數(shù)有三個:Key跷跪、Data橡羞、Mode卿泽。其中Key為7個字節(jié)共56位椎侠,是DES算法的工作密鑰趟据;Data為8個字節(jié)64位,是要被加密或被解密的數(shù)據(jù)荞估;Mode為DES的工作方式,有兩種:加密或解密比被。

密鑰長64位,密鑰事實上是56位參與DES運算(第8泼舱、16等缀、24、32娇昙、40尺迂、48、56、64位是校驗位噪裕,使得每個密鑰都有奇數(shù)個1)蹲盘,分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組。

6.1. python使用

# 導(dǎo)入DES模塊
from Cryptodome.Cipher import DES
import binascii

# 這是密鑰
key = b'abcdefgh'
# 需要去生成一個DES對象
des = DES.new(key, DES.MODE_ECB)
# 需要加密的數(shù)據(jù)
text = 'python spider!'
text = text + (8 - (len(text) % 8)) * '='

# 加密的過程
encrypto_text = des.encrypt(text.encode())
encrypto_text = binascii.b2a_hex(encrypto_text)
print(encrypto_text)

7. 3DES

3DES(或稱為Triple DES)是三重數(shù)據(jù)加密算法(TDEA膳音,Triple Data Encryption Algorithm)塊密碼的通稱召衔。它相當于是對每個數(shù)據(jù)塊應(yīng)用三次DES加密算法。

由于計算機運算能力的增強祭陷,原版DES密碼的密鑰長度變得容易被暴力破解苍凛。3DES即是設(shè)計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊兵志,而不是設(shè)計一種全新的塊密碼算法醇蝴。

3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定為過渡的加密標準)想罕,加密算法悠栓,其具體實現(xiàn)如下:設(shè)Ek()和Dk()代表DES算法的加密和解密過程,K代表DES算法使用的密鑰按价,M代表明文惭适,C代表密文,這樣:

3DES加密過程為:C=Ek3(Dk2(Ek1(M)))

3DES解密過程為:M=Dk1(EK2(Dk3(C)))


8. AES

高級加密標準(英語:Advanced Encryption Standard楼镐,縮寫:AES)腥沽,在密碼學中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準鸠蚪。這個標準用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用师溅。經(jīng)過五年的甄選流程茅信,高級加密標準由美國國家標準與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標準墓臭。2006年蘸鲸,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。

AES在軟件及硬件上都能快速地加解密窿锉,相對來說較易于實作酌摇,且只需要很少的存儲器。作為一個新的加密標準嗡载,目前正被部署應(yīng)用到更廣大的范圍窑多。

8.1. 特點

  1. 抵抗所有已知的攻擊。
  2. 在多個平臺上速度快洼滚,編碼緊湊埂息。
  3. 設(shè)計簡單淫痰。
image.png

AES為分組密碼羔杨,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數(shù)據(jù)适瓦,直到加密完整個明文。在AES標準規(guī)范中串纺,分組長度只能是128位羡疗,也就是說,每個分組為16個字節(jié)(每個字節(jié)8位)豪椿。密鑰的長度可以使用128位奔坟、192位或256位。密鑰的長度不同砂碉,推薦加密輪數(shù)也不同蛀蜜。

一般常用的是128位

8.2. Python實現(xiàn)

from Cryptodome.Cipher import AES
from Cryptodome import Random
from binascii import b2a_hex  

# 要加密的明文
data = '南來北往'
# 密鑰key 長度必須為16(AES-128)、24(AES-192)增蹭、或32(AES-256)Bytes 長度.
# 目前AES-128足夠用
key = b'this is a 16 key'
# 生成長度等于AES塊大小的不可重復(fù)的密鑰向量
iv = Random.new().read(AES.block_size)

# 使用key和iv初始化AES對象, 使用MODE_CFB模式
mycipher = AES.new(key, AES.MODE_CFB, iv)
# 加密的明文長度必須為16的倍數(shù)滴某,如果長度不為16的倍數(shù),則需要補足為16的倍數(shù)
# 將iv(密鑰向量)加到加密的密文開頭滋迈,一起傳輸
ciphertext = iv + mycipher.encrypt(data.encode())

# 解密的話要用key和iv生成新的AES對象
mydecrypt = AES.new(key, AES.MODE_CFB, ciphertext[:16])
# 使用新生成的AES對象霎奢,將加密的密文解密
decrypttext = mydecrypt.decrypt(ciphertext[16:])


print('密鑰k為:', key)
print('iv為:', b2a_hex(ciphertext)[:16])
print('加密后數(shù)據(jù)為:', b2a_hex(ciphertext)[16:])
print('解密后數(shù)據(jù)為:', decrypttext.decode())

運行結(jié)果:

密鑰k為: b'this is a 16 key'
iv為: b'a78a177cffd50878'
加密后數(shù)據(jù)為: b'33f61e7678c25d795d565d40f2f68371da051202'
解密后數(shù)據(jù)為: 南來北往

9. RSA

RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業(yè)中RSA被廣泛使用饼灿。

該算法基于一個十分簡單的數(shù)論事實:將兩個大素數(shù)相乘十分容易幕侠,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰碍彭,即公鑰晤硕,而兩個大素數(shù)組合成私鑰。公鑰是可發(fā)布的供任何人使用庇忌,私鑰則為自己所有舞箍,供解密之用。

9.1. 非對稱加密

典型的如RSA等皆疹,常見方法疏橄,使用openssl ,keytools等工具生成一對公私鑰對,使用被公鑰加密的數(shù)據(jù)可以使用私鑰來解密略就,反之亦然(被私鑰加密的數(shù)據(jù)也可以被公鑰解密) 捎迫。

在實際使用中私鑰一般保存在發(fā)布者手中,是私有的不對外公開的表牢,只將公鑰對外公布窄绒,就能實現(xiàn)只有私鑰的持有者才能將數(shù)據(jù)解密的方法。 這種加密方式安全系數(shù)很高崔兴,因為它不用將解密的密鑰進行傳遞颗祝,從而沒有密鑰在傳遞過程中被截獲的風險浊闪,而破解密文幾乎又是不可能的。

但是算法的效率低螺戳,所以常用于很重要數(shù)據(jù)的加密搁宾,常和對稱配合使用,使用非對稱加密的密鑰去加密對稱加密的密鑰倔幼。

9.2. Python實現(xiàn)

首先我們需要安裝一個rsa模塊:

pip install rsa

而且盖腿,因為RSA加密算法的特性,RSA的公鑰私鑰都是10進制的损同,但公鑰的值常常保存為16進制的格式翩腐,所以需要將其用int()方法轉(zhuǎn)換為10進制格式。

import rsa
import binascii

# 使用網(wǎng)頁中獲得的n和e值膏燃,將明文加密
def rsa_encrypt(rsa_n, rsa_e, message):
    # 用n值和e值生成公鑰
    key = rsa.PublicKey(rsa_n, rsa_e)
    # 用公鑰把明文加密
    message = rsa.encrypt(message.encode(), key)
    # 轉(zhuǎn)化成常用的可讀性高的十六進制
    message = binascii.b2a_hex(message)
    # 將加密結(jié)果轉(zhuǎn)化回字符串并返回
    return message.decode()

# RSA的公鑰有兩個值n和e茂卦,我們在網(wǎng)站中獲得的公鑰一般就是這樣的兩個值。
# n常常為長度為256的十六進制字符串
# e常常為十六進制‘10001’
pubkey_n = '8d7e6949d411ce14d7d233d7160f5b2cc753930caba4d5ad24f923a505253b9c39b09a059732250e56c594d735077cfcb0c3508e9f544f101bdf7e97fe1b0d97f273468264b8b24caaa2a90cd9708a417c51cf8ba35444d37c514a0490441a773ccb121034f29748763c6c4f76eb0303559c57071fd89234d140c8bb965f9725'
pubkey_e = '10001'
# 需要將十六進制轉(zhuǎn)換成十進制
rsa_n = int(pubkey_n, 16)
rsa_e = int(pubkey_e, 16)
# 要加密的明文
message = '南北今天很忙'

print("公鑰n值長度:", len(pubkey_n))
print(rsa_encrypt(rsa_n, rsa_e, message))

運行結(jié)果:

公鑰n值長度: 256
480f302eed822c8250256511ddeb017fcb28949cc05739ae66440eecc4ab76e7a7b2f1df398aefdfef2b9bfce6d6152bf6cc1552a0ed8bebee9e094a7ce9a52622487a6412632144787aa81f6ec9b96be95890c4c28a31b3e8d9ea430080d79297c5d75cd11df04df6e71b237511164399d72ccb2f4c34022b1ea7b76189a56e
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末组哩,一起剝皮案震驚了整個濱河市等龙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伶贰,老刑警劉巖蛛砰,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黍衙,居然都是意外死亡泥畅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門琅翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位仁,“玉大人,你說我怎么就攤上這事方椎∧羟溃” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵辩尊,是天一觀的道長。 經(jīng)常有香客問我康辑,道長摄欲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任疮薇,我火速辦了婚禮胸墙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘按咒。我一直安慰自己迟隅,他們只是感情好,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著智袭,像睡著了一般奔缠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吼野,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天校哎,我揣著相機與錄音,去河邊找鬼瞳步。 笑死闷哆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的单起。 我是一名探鬼主播抱怔,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘀倒!你這毒婦竟也來了屈留?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤括儒,失蹤者是張志新(化名)和其女友劉穎绕沈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帮寻,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡乍狐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了固逗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浅蚪。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烫罩,靈堂內(nèi)的尸體忽然破棺而出惜傲,到底是詐尸還是另有隱情,我是刑警寧澤贝攒,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布盗誊,位于F島的核電站,受9級特大地震影響隘弊,放射性物質(zhì)發(fā)生泄漏哈踱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一梨熙、第九天 我趴在偏房一處隱蔽的房頂上張望开镣。 院中可真熱鬧,春花似錦咽扇、人聲如沸邪财。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽树埠。三九已至糠馆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弥奸,已是汗流浹背榨惠。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盛霎,地道東北人赠橙。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像愤炸,于是被迫代替她去往敵國和親期揪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 概述 之前一直對加密相關(guān)的算法知之甚少规个,只知道類似DES凤薛、RSA等加密算法能對數(shù)據(jù)傳輸進行加密,且各種加密算法各有...
    Henryzhu閱讀 3,009評論 0 14
  • 這篇文章主要講述在Mobile BI(移動商務(wù)智能)開發(fā)過程中诞仓,在網(wǎng)絡(luò)通信缤苫、數(shù)據(jù)存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,355評論 0 6
  • 本文主要介紹移動端的加解密算法的分類墅拭、其優(yōu)缺點特性及應(yīng)用活玲,幫助讀者由淺入深地了解和選擇加解密算法。文中會包含算法的...
    蘋果粉閱讀 11,470評論 5 29
  • 父親要教女兒學炒菜谍婉,女兒不肯學舒憾。 父親:“不學也要學,不學就不要嫁人穗熬《朴兀” 女兒:“炒菜與嫁人有什么關(guān)系?” 父親:...
    淹死歲月的蝸牛閱讀 412評論 0 0
  • 求求你唤蔗,告訴我你一切平安好不好探遵?
    歸處的美男子閱讀 133評論 0 0