以下是关于 Python 实现 AES 和 RSA 加解密的完整攻略:
什么是 AES 和 RSA 加解密
AES(Advanced Encryption Standard,高级加密标准)和 RSA(Rivest–Shamir–Adleman)都是常用的加密算法。其中,AES 是对称加密算法,加密和解密使用同一个密钥,而 RSA 是非对称加密算法,加密和解密使用不同的密钥。
Python 实现 AES 加解密
Python 可以使用 PyCrypto 库来实现 AES 加解密。下面是一个简单的例子:
from Crypto.Cipher import AES
import base64
def aes_encrypt(text, key):
bs = AES.block_size
pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
cipher = AES.new(key, AES.MODE_ECB)
encrypted_text = cipher.encrypt(pad(text)).hex()
return encrypted_text
def aes_decrypt(encrypted_text, key):
bs = AES.block_size
unpad = lambda s: s[0:-ord(s[-1])]
encrypted_text = bytes.fromhex(encrypted_text)
cipher = AES.new(key, AES.MODE_ECB)
decrypted_text = unpad(cipher.decrypt(encrypted_text)).decode()
return decrypted_text
key = b'mysecretpassword'
text = 'Hello World'
encrypted_text = aes_encrypt(text, key)
print('Encrypted Text:', encrypted_text)
decrypted_text = aes_decrypt(encrypted_text, key)
print('Decrypted Text:', decrypted_text)
这个例子中,我们使用了 ECB 模式和 PKCS7 填充方式。在实际使用中,我们需要根据具体的需求选择不同的模式和填充方式。
Python 实现 RSA 加解密
Python 可以使用 PyCrypto 库来实现 RSA 加解密。下面是一个简单的例子:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
def rsa_encrypt(text, public_key):
key = RSA.importKey(public_key)
cipher = PKCS1_v1_5.new(key)
encrypted_text = cipher.encrypt(text.encode())
return base64.b64encode(encrypted_text).decode()
def rsa_decrypt(encrypted_text, private_key):
key = RSA.importKey(private_key)
cipher = PKCS1_v1_5.new(key)
encrypted_text = base64.b64decode(encrypted_text)
decrypted_text = cipher.decrypt(encrypted_text, None).decode()
return decrypted_text
public_key_str = '''
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+L4WAhPBPa/U6CkLQljcz5k66
YLv9ZuGv+bcV6CGjG6B99RNaXOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939x
GcJhBOxikYpb91cmw4rowVTHv0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v
7h9ZCUSsSd/v/qWAAwIDAQAB
-----END PUBLIC KEY-----
'''
private_key_str = '''
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+L4WAhPBPa/U6CkLQljcz5k66YLv9ZuGv+bcV6CGjG6B99RNa
XOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939xGcJhBOxikYpb91cmw4rowVTH
v0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v7h9ZCUSsSd/v/qWAAwIDAQAB
AoGAbTBNq3VqBkdZgXz29ct6hTv+rAgp6027WqelONxXq8TJW4tYYBBqXdJ8ru6X
sk2jyL7mZ3TilqK4aBlkCQStoJXAVfc/fko8hSgJzmvJb2PzK3WMT4fBUqlg5ie9
H26GeZ6fVz4bNi5ewrWkyyBdv80KBcfgJ8w2lV+JjxLnp8ECQQDyBGqc7k8k8wfb
6mA+J4bMiBC+RVXqhJsgY4HvufGteXRvF57dY9NygOqDCz4CpP2VFe1wRplLeKXk
SeGJU4RHAkEAywg6f6AcMGCjd/AAN/Fg+kS1sF9mXOpiJNw4R3jOM/p4Nogp/bx+
KyFRjQsGnCKCPs7Usf7S7+LsU3U3g65fDQJAPyoKrmfIc95nD5LDoSsi2vBEXg4L
j1urI7Lop9J7gVxkgfqncZi1Qa7QxZLqmH8AR4I0mwoNDww0re+uM+nHvQJAbUwH
69E/VWJzMxEHptpKvtNsdj/yXXlZ+R5luMgpkWjXZtjiT7+qOBsYmI1d2V6Rr752
/NbxLZQC3XJXanJ2RQJAT++9snMuzqMkT3adgJKdoS55KPaal7hnyu9fm0l5eB4P
685PiP32qMsySeQfzV4FBt4EkLBIf5KzKZV9wgw4Mg==
-----END RSA PRIVATE KEY-----
'''
public_key = public_key_str.encode()
private_key = private_key_str.encode()
text = 'Hello World'
encrypted_text = rsa_encrypt(text, public_key)
print('Encrypted Text:', encrypted_text)
decrypted_text = rsa_decrypt(encrypted_text, private_key)
print('Decrypted Text:', decrypted_text)
这个例子中,我们使用了 PKCS1_v1_5 填充方式,其他的填充方式还有 OAEP,可以根据具体需求选择。
示例
这里再给出一个 AES 和 RSA 一起使用的例子,通过 AES 加密文本,然后使用 RSA 加密 AES 密钥,最后把加密后的密钥和密文一起发送过去。接收方使用私钥解密 AES 密钥,然后再使用 AES 解密密文。
from Crypto.Cipher import AES, PKCS1_v1_5
from Crypto.PublicKey import RSA
import base64
def aes_encrypt(text, key):
bs = AES.block_size
pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
cipher = AES.new(key, AES.MODE_ECB)
encrypted_text = cipher.encrypt(pad(text)).hex()
return encrypted_text
def aes_decrypt(encrypted_text, key):
bs = AES.block_size
unpad = lambda s: s[0:-ord(s[-1])]
encrypted_text = bytes.fromhex(encrypted_text)
cipher = AES.new(key, AES.MODE_ECB)
decrypted_text = unpad(cipher.decrypt(encrypted_text)).decode()
return decrypted_text
def rsa_encrypt(text, public_key):
key = RSA.importKey(public_key)
cipher = PKCS1_v1_5.new(key)
encrypted_text = cipher.encrypt(text.encode())
return base64.b64encode(encrypted_text).decode()
def rsa_decrypt(encrypted_text, private_key):
key = RSA.importKey(private_key)
cipher = PKCS1_v1_5.new(key)
encrypted_text = base64.b64decode(encrypted_text)
decrypted_text = cipher.decrypt(encrypted_text, None).decode()
return decrypted_text
public_key_str = '''
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+L4WAhPBPa/U6CkLQljcz5k66
YLv9ZuGv+bcV6CGjG6B99RNaXOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939x
GcJhBOxikYpb91cmw4rowVTHv0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v
7h9ZCUSsSd/v/qWAAwIDAQAB
-----END PUBLIC KEY-----
'''
private_key_str = '''
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+L4WAhPBPa/U6CkLQljcz5k66YLv9ZuGv+bcV6CGjG6B99RNa
XOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939xGcJhBOxikYpb91cmw4rowVTH
v0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v7h9ZCUSsSd/v/qWAAwIDAQAB
AoGAbTBNq3VqBkdZgXz29ct6hTv+rAgp6027WqelONxXq8TJW4tYYBBqXdJ8ru6X
sk2jyL7mZ3TilqK4aBlkCQStoJXAVfc/fko8hSgJzmvJb2PzK3WMT4fBUqlg5ie9
H26GeZ6fVz4bNi5ewrWkyyBdv80KBcfgJ8w2lV+JjxLnp8ECQQDyBGqc7k8k8wfb
6mA+J4bMiBC+RVXqhJsgY4HvufGteXRvF57dY9NygOqDCz4CpP2VFe1wRplLeKXk
SeGJU4RHAkEAywg6f6AcMGCjd/AAN/Fg+kS1sF9mXOpiJNw4R3jOM/p4Nogp/bx+
KyFRjQsGnCKCPs7Usf7S7+LsU3U3g65fDQJAPyoKrmfIc95nD5LDoSsi2vBEXg4L
j1urI7Lop9J7gVxkgfqncZi1Qa7QxZLqmH8AR4I0mwoNDww0re+uM+nHvQJAbUwH
69E/VWJzMxEHptpKvtNsdj/yXXlZ+R5luMgpkWjXZtjiT7+qOBsYmI1d2V6Rr752
/NbxLZQC3XJXanJ2RQJAT++9snMuzqMkT3adgJKdoS55KPaal7hnyu9fm0l5eB4P
685PiP32qMsySeQfzV4FBt4EkLBIf5KzKZV9wgw4Mg==
-----END RSA PRIVATE KEY-----
'''
public_key = public_key_str.encode()
private_key = private_key_str.encode()
text = 'Hello World'
key = b'mysecretpassword'
encrypted_key = rsa_encrypt(key.decode(), public_key)
encrypted_text = aes_encrypt(text, key)
# send encrypted_key and encrypted_text to the receiver
decrypted_key = rsa_decrypt(encrypted_key, private_key)
decrypted_text = aes_decrypt(encrypted_text, decrypted_key.encode())
print('Original Text:', text)
print('Decrypted Text:', decrypted_text)
这个例子中,我们先使用 AES 加密了文本,然后使用 RSA 加密了 AES 密钥。接收方先使用私钥解密了 AES 密钥,然后再使用 AES 解密了文本。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现AES和RSA加解密的方法 - Python技术站