在Python中,實(shí)現(xiàn)常見(jiàn)的加密算法可以通過(guò)多種方式完成,包括使用內(nèi)置模塊和第三方庫(kù)。以下是一些常見(jiàn)的加密算法及其Python實(shí)現(xiàn)方法:
1. 對(duì)稱加密
對(duì)稱加密使用相同的密鑰進(jìn)行加密和解密。常見(jiàn)的對(duì)稱加密算法包括AES、DES和3DES。
AES加密
AES(高級(jí)加密標(biāo)準(zhǔn))是一種廣泛使用的對(duì)稱加密算法,支持128位、192位和256位密鑰長(zhǎng)度。在Python中,可以使用PyCryptodome庫(kù)來(lái)實(shí)現(xiàn)AES加密。
from Crypto.Cipher import AES
import binascii
# 密鑰和初始化向量
key = b'this is a 16 key'
iv = Random.new().read(AES.block_size)
# 創(chuàng)建AES對(duì)象
cipher = AES.new(key, AES.MODE_CFB, iv)
# 要加密的數(shù)據(jù)
data = '南來(lái)北往'
# 加密數(shù)據(jù)
encrypted_data = cipher.encrypt(data.encode())
# 解密數(shù)據(jù)
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的數(shù)據(jù):', binascii.b2a_hex(encrypted_data))
print('解密后的數(shù)據(jù):', decrypted_data.decode())
運(yùn)行
DES加密
DES(數(shù)據(jù)加密標(biāo)準(zhǔn))是一種較老的對(duì)稱加密算法,密鑰長(zhǎng)度為56位。在Python中,可以使用PyCryptodome庫(kù)來(lái)實(shí)現(xiàn)DES加密。
from Crypto.Cipher import DES
import binascii
# 密鑰
key = b'abcdefgh'
# 創(chuàng)建DES對(duì)象
cipher = DES.new(key, DES.MODE_ECB)
# 要加密的數(shù)據(jù)
data = 'python spider!'
# 加密數(shù)據(jù)
encrypted_data = cipher.encrypt(data.encode())
# 解密數(shù)據(jù)
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的數(shù)據(jù):', binascii.b2a_hex(encrypted_data))
print('解密后的數(shù)據(jù):', decrypted_data.decode())
3DES加密
3DES(三重?cái)?shù)據(jù)加密算法)是對(duì)DES的改進(jìn),通過(guò)三次DES加密提高安全性。在Python中,可以使用PyCryptodome庫(kù)來(lái)實(shí)現(xiàn)3DES加密。
from Crypto.Cipher import DES3
import binascii
# 密鑰
key = b'this is a 16 key'
# 創(chuàng)建3DES對(duì)象
cipher = DES3.new(key, DES3.MODE_ECB)
# 要加密的數(shù)據(jù)
data = '南來(lái)北往'
# 加密數(shù)據(jù)
encrypted_data = cipher.encrypt(data.encode())
# 解密數(shù)據(jù)
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的數(shù)據(jù):', binascii.b2a_hex(encrypted_data))
print('解密后的數(shù)據(jù):', decrypted_data.decode())
運(yùn)行
2. 非對(duì)稱加密
非對(duì)稱加密使用一對(duì)密鑰,公鑰用于加密,私鑰用于解密。常見(jiàn)的非對(duì)稱加密算法包括RSA和ECC。
RSA加密
RSA是一種廣泛使用的非對(duì)稱加密算法,基于大素?cái)?shù)乘積的難分解性。在Python中,可以使用rsa庫(kù)來(lái)實(shí)現(xiàn)RSA加密。
import rsa
# 生成公鑰和私鑰
(pubkey, privkey) = rsa.generate_keypair(n_length=1024)
# 要加密的數(shù)據(jù)
data = '南北今天很忙'
# 加密數(shù)據(jù)
encrypted_data = rsa.encrypt(data.encode(), pubkey)
# 解密數(shù)據(jù)
decrypted_data = rsa.decrypt(encrypted_data, privkey)
print('加密后的數(shù)據(jù):', binascii.b2a_hex(encrypted_data))
print('解密后的數(shù)據(jù):', decrypted_data.decode())
運(yùn)行
ECC加密
ECC(橢圓曲線密碼學(xué))是一種基于橢圓曲線數(shù)學(xué)的非對(duì)稱加密算法,具有更高的安全性和效率。在Python中,可以使用cryptography庫(kù)來(lái)實(shí)現(xiàn)ECC加密。
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization
# 生成ECC密鑰對(duì)
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
# 要加密的數(shù)據(jù)
data = '南北今天很忙'
# 加密數(shù)據(jù)
encrypted_data = public_key.encrypt(
data.encode(),
padding.PKCS1v15()
)
# 解密數(shù)據(jù)
decrypted_data = private_key.decrypt(
encrypted_data,
padding.PKCS1v15()
)
print('加密后的數(shù)據(jù):', binascii.b2a_hex(encrypted_data))
print('解密后的數(shù)據(jù):', decrypted_data.decode())
運(yùn)行
3. 單向哈希函數(shù)
單向哈希函數(shù)將任意長(zhǎng)度的數(shù)據(jù)映射為固定長(zhǎng)度的哈希值,常用于數(shù)據(jù)完整性檢查和密碼存儲(chǔ)。常見(jiàn)的哈希算法包括MD5、SHA1、SHA256等。
MD5哈希
MD5是一種較老的哈希算法,生成128位的哈希值。在Python中,可以使用hashlib庫(kù)來(lái)實(shí)現(xiàn)MD5哈希。
import hashlib
# 要哈希的數(shù)據(jù)
data = '這是一個(gè)測(cè)試'
# 計(jì)算MD5哈希
hash_object = hashlib.md5(data.encode())
hex_dig = hash_object.hexdigest()
print('MD5哈希值:', hex_dig)
運(yùn)行
SHA256哈希
SHA256是一種更安全的哈希算法,生成256位的哈希值。在Python中,可以使用hashlib庫(kù)來(lái)實(shí)現(xiàn)SHA256哈希。
import hashlib
# 要哈希的數(shù)據(jù)
data = '這是一個(gè)測(cè)試'
# 計(jì)算SHA256哈希
hash_object = hashlib.sha256(data.encode())
hex_dig = hash_object.hexdigest()
print('SHA256哈希值:', hex_dig)
運(yùn)行
4. Base64編碼
Base64是一種將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為文本的編碼方式,常用于數(shù)據(jù)傳輸和存儲(chǔ)。在Python中,可以使用base64模塊來(lái)實(shí)現(xiàn)Base64編碼和解碼。
import base64
# 要編碼的數(shù)據(jù)
data = 'hello world'
# 編碼數(shù)據(jù)
encoded_data = base64.b64encode(data.encode())
# 解碼數(shù)據(jù)
decoded_data = base64.b64decode(encoded_data).decode()
print('Base64編碼后的數(shù)據(jù):', encoded_data)
print('Base64解碼后的數(shù)據(jù):', decoded_data)
運(yùn)行
5. URL編碼
URL編碼是一種將超出ASCII范圍的字符轉(zhuǎn)換為帶%的十六進(jìn)制格式的編碼方式。在Python中,可以使用urllib.parse模塊來(lái)實(shí)現(xiàn)URL編碼和解碼。
from urllib.parse import quote, unquote
# 要編碼的數(shù)據(jù)
data = '南北今天很忙'
# 編碼數(shù)據(jù)
encoded_data = quote(data)
# 解碼數(shù)據(jù)
decoded_data = unquote(encoded_data)
print('URL編碼后的數(shù)據(jù):', encoded_data)
print('URL解碼后的數(shù)據(jù):', decoded_data)
運(yùn)行
6. HMAC加密
HMAC(Hash-based Message Authentication Code)是一種基于哈希函數(shù)的認(rèn)證碼,用于驗(yàn)證數(shù)據(jù)的完整性和真實(shí)性。在Python中,可以使用hmac庫(kù)來(lái)實(shí)現(xiàn)HMAC加密。
import hmac
import hashlib
# 要加密的數(shù)據(jù)
data = '這是一個(gè)測(cè)試'
# 密鑰
key = b'123456'
# 計(jì)算HMAC
hmac_object = hmac.new(key, data.encode(), digestmod='sha256')
hex_dig = hmac_object.hexdigest()
print('HMAC值:', hex_dig)
運(yùn)行
7. CBC模式
CBC(Cipher Block Chaining)是一種分組加密模式,通過(guò)將前一個(gè)塊的密文與當(dāng)前塊的明文進(jìn)行異或操作,提高加密的安全性。在Python中,可以使用PyCryptodome庫(kù)來(lái)實(shí)現(xiàn)CBC模式的加密。
from Crypto.Cipher import AES
import binascii
# 密鑰和初始化向量
key = b'this is a 16 key'
iv = Random.new().read(AES.block_size)
# 創(chuàng)建AES對(duì)象
cipher = AES.new(key, AES.MODE_CBC, iv)
# 要加密的數(shù)據(jù)
data = '南來(lái)北往'
# 加密數(shù)據(jù)
encrypted_data = cipher.encrypt(data.encode())
# 解密數(shù)據(jù)
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的數(shù)據(jù):', binascii.b2a_hex(encrypted_data))
print('解密后的數(shù)據(jù):', decrypted_data.decode())
運(yùn)行
8. ECB模式
ECB(Electronic Codebook)是一種分組加密模式,每個(gè)塊獨(dú)立加密,但安全性較低。在Python中,可以使用PyCryptodome庫(kù)來(lái)實(shí)現(xiàn)ECB模式的加密。
from Crypto.Cipher import AES
import binascii
# 密鑰
key = b'this is a 16 key'
# 創(chuàng)建AES對(duì)象
cipher = AES.new(key, AES.MODE_ECB)
# 要加密的數(shù)據(jù)
data = '南來(lái)北往'
# 加密數(shù)據(jù)
encrypted_data = cipher.encrypt(data.encode())
# 解密數(shù)據(jù)
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的數(shù)據(jù):', binascii