您好,登錄后才能下訂單哦!
閱讀目錄
前言
加密算法分類
Python加密庫
DES加密
AES加密
RSA加密
前言
據記載,公元前400年,古希臘人發明了置換密碼。1881年世界上的第一個電話保密專利出現。在第二次世界大戰期間,德國軍方啟用“恩尼格瑪”密碼機,密碼學在戰爭中起著非常重要的作用。
隨著信息化和數字化社會的發展,人們對信息安全和保密的重要性認識不斷提高,于是在1997年,美國國家標準局公布實施了“美國數據加密標準(DES)”,民間力量開始全面介入密碼學的研究和應用中,采用的加密算法有DES、RSA、SHA等。
隨著對加密強度需求的不斷提高,近期又出現了AES、ECC等。
使用密碼學可以達到以下目的:
保密性:防止用戶的標識或數據被讀取。
數據完整性:防止數據被更改。
身份驗證:確保數據發自特定的一方。
加密算法分類
對稱加密算法:
對稱加密采用了對稱密碼編碼技術,它的特點是文件加密和解密使用相同的密鑰發送方和接收方需要持有同一把密鑰,發送消息和接收消息均使用該密鑰。
相對于非對稱加密,對稱加密具有更高的加解密速度,但雙方都需要事先知道密鑰,密鑰在傳輸過程中可能會被竊取,因此安全性沒有非對稱加密高。
常見的對稱加密算法:DES,AES,3DES等等
非對稱加密算法:
文件加密需要公開密鑰(publickey)和私有密鑰(privatekey)。
接收方在發送消息前需要事先生成公鑰和私鑰,然后將公鑰發送給發送方。發送放收到公鑰后,將待發送數據用公鑰加密,發送給接收方。接收到收到數據后,用私鑰解密。
在這個過程中,公鑰負責加密,私鑰負責解密,數據在傳輸過程中即使被截獲,攻擊者由于沒有私鑰,因此也無法破解。
非對稱加密算法的加解密速度低于對稱加密算法,但是安全性更高。
非對稱加密算法:RSA、DSA、ECC等算法
消息摘要算法:
消息摘要算法可以驗證信息是否被篡改。
在數據發送前,首先使用消息摘要算法生成該數據的簽名,然后簽名和數據一同發送給接收者。
接收者收到數據后,對收到的數據采用消息摘要算法獲得簽名,最后比較簽名是否一致,以此來判斷數據在傳輸過程中是否發生修改。
Python加密庫
PyCrypto是 Python 中密碼學方面最有名的第三方軟件包。可惜的是,它的開發工作于2012年就已停止。
其他人還在繼續發布最新版本的 PyCrypto,如果你不介意使用第三方的二進制包,仍可以取得Python 3.5 的相應版本。
比如,可以在 Github 上找到了對應Python3.5的PyCrypto 二進制包。
幸運的是,有一個該項目的分支PyCrytodome 取代了 PyCrypto 。為了在 Linux 上安裝它,
你可以使用以下pip 命令:
pip3 install -i https://pypi.douban.com/simple pycryptodome
在Windows 系統上安裝則稍有不同:
pip3 install -i https://pypi.douban.com/simple pycryptodomex
DES加密
全稱為Data EncryptionStandard,即數據加密標準,是一種使用密鑰加密的塊算法
入口參數有三個:Key、Data、Mode
Key為7個字節共56位,是DES算法的工作密鑰;
Data為8個字節64位,是要被加密或被解密的數據;
Mode為DES的工作方式,有兩種:加密或解密
3DES(即Triple DES)是DES向AES過渡的加密算法,
使用兩個密鑰,執行三次DES算法,
加密的過程是加密-解密-加密
解密的過程是解密-加密-解密
from Crypto.Cipher import DES key = b'abcdefgh' # 密鑰 8位或16位,必須為bytes def pad(text): """ # 加密函數,如果text不是8的倍數【加密文本text必須為8的倍數!】,那就補足為8的倍數 :param text: :return: """ while len(text) % 8 != 0: text += ' ' return text des = DES.new(key, DES.MODE_ECB) # 創建一個DES實例 text = 'Python rocks!' padded_text = pad(text) encrypted_text = des.encrypt(padded_text.encode('utf-8')) # 加密 print(encrypted_text) # rstrip(' ')返回從字符串末尾刪除所有字符串的字符串(默認空白字符)的副本 plain_text = des.decrypt(encrypted_text).decode().rstrip(' ') # 解密 print(plain_text) #
AES加密
高級加密標準(英語:Advanced EncryptionStandard,縮寫:AES),這個標準用來替代原先的DES
AES的區塊長度固定為128 比特,密鑰長度則可以是128,192或256比特(16、24和32字節)
大致步驟如下:
1、密鑰擴展(KeyExpansion),
2、初始輪(Initial Round),
3、重復輪(Rounds),每一輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,
4、最終輪(Final Round),最終輪沒有MixColumns。
普通方式
from Cryptodome.Cipher import AES from binascii import b2a_hex, a2b_hex #秘鑰,此處需要將字符串轉為字節 key = 'abcdefgh' #加密內容需要長達16位字符,所以進行空格拼接 def pad(text): while len(text) % 16 != 0: text += ' ' return text #加密秘鑰需要長達16位字符,所以進行空格拼接 def pad_key(key): while len(key) % 16 != 0: key += ' ' return key #進行加密算法,模式ECB模式,把疊加完16位的秘鑰傳進來 aes = AES.new(pad_key(key).encode(), AES.MODE_ECB) #加密內容,此處需要將字符串轉為字節 text = 'hello' #進行內容拼接16位字符后傳入加密類中,結果為字節類型 encrypted_text = aes.encrypt(pad(text).encode()) encrypted_text_hex = b2a_hex(encrypted_text) print(encrypted_text_hex) # #此處是為了驗證是否能將字節轉為字符串后,進行解密成功 # #實際上a 就是 encrypted_text ,也就是加密后的內容 # #用aes對象進行解密,將字節類型轉為str類型,錯誤編碼忽略不計 de = str(aes.decrypt(a2b_hex(encrypted_text_hex)), encoding='utf-8',errors="ignore") # #獲取str從0開始到文本內容的字符串長度。 print(de[:len(text)])
面向對象方式
from Cryptodome.Cipher import AES from binascii import b2a_hex, a2b_hex AES_LENGTH = 16 class prpcrypt(): def __init__(self, key): self.key = key self.mode = AES.MODE_ECB self.cryptor = AES.new(self.pad_key(self.key).encode(), self.mode) # 加密函數,如果text不是16的倍數【加密文本text必須為16的倍數!】,那就補足為16的倍數 # 加密內容需要長達16位字符,所以進行空格拼接 def pad(self,text): while len(text) % AES_LENGTH != 0: text += ' ' return text # 加密密鑰需要長達16位字符,所以進行空格拼接 def pad_key(self,key): while len(key) % AES_LENGTH != 0: key += ' ' return key def encrypt(self, text): # 這里密鑰key 長度必須為16(AES-128)、24(AES-192)、或32(AES-256)Bytes 長度.目前AES-128足夠用 # 加密的字符需要轉換為bytes # print(self.pad(text)) self.ciphertext = self.cryptor.encrypt(self.pad(text).encode()) # 因為AES加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題 # 所以這里統一把加密后的字符串轉化為16進制字符串 return b2a_hex(self.ciphertext) # 解密后,去掉補足的空格用strip() 去掉 def decrypt(self, text): plain_text = self.cryptor.decrypt(a2b_hex(text)).decode() return plain_text.rstrip(' ') if __name__ == '__main__': pc = prpcrypt('abcdef') # 初始化密鑰 e = pc.encrypt("0123456789ABCDEF") d = pc.decrypt(e) print(e, d) e = pc.encrypt("00000000000000000000000000") d = pc.decrypt(e) print(e, d)
RSA加密
公鑰加密算法,一種非對稱密碼算法
公鑰加密,私鑰解密
3個參數:
rsa_n, rsa_e,message
rsa_n, rsa_e 用于生成公鑰
message: 需要加密的消息
安裝 pip install rsa
使用
import rsa from binascii import b2a_hex, a2b_hex class rsacrypt(): def __init__(self, pubkey, prikey): self.pubkey = pubkey self.prikey = prikey def encrypt(self, text): self.ciphertext = rsa.encrypt(text.encode(), self.pubkey) # 因為rsa加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題 # 所以這里統一把加密后的字符串轉化為16進制字符串 return b2a_hex(self.ciphertext) def decrypt(self, text): decrypt_text = rsa.decrypt(a2b_hex(text), prikey) return decrypt_text if __name__ == '__main__': pubkey, prikey = rsa.newkeys(256) rs_obj = rsacrypt(pubkey,prikey) text='hello' ency_text = rs_obj.encrypt(text) print(ency_text) print(rs_obj.decrypt(ency_text)) """ b'7cb319c67853067abcd16aad25b3a8658e521f83b1e6a6cf0c4c2e9303ad3e14' b'hello' """
python 加密解密 使用base64或pycrypto模塊
1. 使用base64
s1 = base64.encodestring('hello world') s2 = base64.decodestring(s1) print s1, s2
結果
aGVsbG8gd29ybGQ=
hello world
Base64編碼,64指A-Z、a-z、0-9、+和/這64個字符,還有“=”號不屬于編碼字符,而是填充字符。為什么發明這么個編碼呢,這個編碼的原理很簡單,“破解”也很容易,原因是電子郵件剛出來的時候,只傳遞英文字符,這沒有問題,但是后來,中國人,日本人都要發email,這樣問題就來了,因為這些字符有可能會被郵件服務器或者網關當成命令處理,故必須得有一種編碼來對郵件進行加密,但是加密的目的是為了能夠使得一些原始的服務器不出問題(現在服務器早已經能處理這些亂七八糟得情況了,不過因為已經形成了一套規范,所以郵件還是得經過Base64編碼才能傳遞)。
優點:方法簡單
缺點:不保險,別人拿到密文可以自己解密出明文
編碼原理:將3個字節轉換成4個字節((3 X 8)=24=(4X6)),先讀入3個字節,每讀一個字節,左移8位,再右移四次,每次6位,這樣就有4個字節了。
解碼原理:將4個字節轉換成3個字節,先讀入4個6位(用或運算),每次左移6位,再右移3次,每次8位,這樣就還原了。
2. 使用pycrypto模塊
>>> from Crypto.Cipher import AES >>> obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') >>> message = "The answer is no" >>> ciphertext = obj.encrypt(message) >>> ciphertext '\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1' >>> obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') >>> obj2.decrypt(ciphertext) 'The answer is no'
高級加密標準(Advanced Encryption Standard,AES),是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。
AES只是個基本算法,實現AES有若干模式。其中的CBC模式因為其安全性而被TLS(就是https的加密標準)和IPSec(win采用的)作為技術標準。簡單地說,CBC使用密碼和salt(起擾亂作用)按固定算法(md5)產生key和iv。然后用key和iv(初始向量,加密第一塊明文)加密(明文)和解密(密文)。
再來一例
#coding: utf8 import sys from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex class prpcrypt(): def __init__(self, key): self.key = key self.mode = AES.MODE_CBC #加密函數,如果text不是16的倍數【加密文本text必須為16的倍數!】,那就補足為16的倍數 def encrypt(self, text): cryptor = AES.new(self.key, self.mode, self.key) #這里密鑰key 長度必須為16(AES-128)、24(AES-192)、或32(AES-256)Bytes 長度.目前AES-128足夠用 length = 16 count = len(text) add = length - (count % length) text = text + ('\0' * add) self.ciphertext = cryptor.encrypt(text) #因為AES加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題 #所以這里統一把加密后的字符串轉化為16進制字符串 return b2a_hex(self.ciphertext) #解密后,去掉補足的空格用strip() 去掉 def decrypt(self, text): cryptor = AES.new(self.key, self.mode, self.key) plain_text = cryptor.decrypt(a2b_hex(text)) return plain_text.rstrip('\0') if __name__ == '__main__': pc = prpcrypt('keyskeyskeyskeys') #初始化密鑰 e = pc.encrypt("00000") d = pc.decrypt(e) print e, d e = pc.encrypt("00000000000000000000000000") d = pc.decrypt(e) print e, d
運行結果
a9755fd70d8d6db65a6fac12d4797dde 00000
2c1969f213c703ebedc36f9e7e5a2b88922ac938c983201c200da51073d00b2c 00000000000000000000000000
這篇文章就介紹到這了需要朋友可以參考一下。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。