非对称加密算法,也称为公钥加密算法,使用一对密钥:一个公钥和一个私钥。公钥用于加密数据,私钥用于解密数据。以下是一些常见的非对称加密算法及其特点:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP import binascii
# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 加密消息
message = 'Hello, World!'
public_key_obj = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(public_key_obj)
encrypted_message = cipher.encrypt(message.encode())
print(binascii.hexlify(encrypted_message))
# 解密消息
private_key_obj = RSA.import_key(private_key)
cipher = PKCS1_OAEP.new(private_key_obj)
decrypted_message = cipher.decrypt(encrypted_message)
print(decrypted_message.decode())
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from Crypto.Hash import SHA256
# 生成密钥对
key = DSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 签名消息
message = 'Hello, World!'
hash_obj = SHA256.new(message.encode())
signer = DSS.new(key, 'fips-186-3')
signature = signer.sign(hash_obj)
# 验证签名
public_key_obj = DSA.import_key(public_key)
verifier = DSS.new(public_key_obj, 'fips-186-3')
try:
verifier.verify(hash_obj, signature)
print("The signature is authentic.")
except ValueError:
print("The signature is not authentic.")
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
# 创建密钥对
private_key = ec.generate_private_key(ec.SECP384R1())
public_key = private_key.public_key()
# 加密消息(ECC 通常不直接用于加密,这里以ECDH共享秘密为例)
peer_private_key = ec.generate_private_key(ec.SECP384R1())
shared_secret = private_key.exchange(ec.ECDH(), peer_private_key.public_key())
# 使用共享秘密来加密数据(通常与对称加密结合使用)
# ...
# 导出私钥
pem = private_key.private_bytes( encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption() )
# 导出公钥
pem = public_key.public_bytes( encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo )
pycryptodome
库支持 ElGamal 算法,但其使用较为复杂且不常见,因此在此不详细展示。非对称加密算法通常计算量大,因此它们不适合直接用于加密大量数据。在实际应用中,通常结合对称加密算法使用:非对称加密用来加密对称密钥(也称为会话密钥),而对称密钥则用来加密实际的数据。这种方法结合了两种算法的优势:非对称加密的安全性和对称加密的速度。
在使用非对称加密算法时,通常需要借助专门的加密库,如Python中的cryptography
和pycryptodome
,它们提供了高层的API,简化了加密和解密的过程。而在Shell脚本中,通常使用OpenSSL工具进行非对称加密操作:
# 生成RSA私钥
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# 从私钥导出公钥
openssl rsa -pubout -in private_key.pem -out public_key.pem
# 使用公钥加密数据
echo "Hello, World!" | openssl rsautl -encrypt -pubin -inkey public_key.pem | openssl base64
# 使用私钥解密数据
echo "BASE64 ENCRYPTED DATA" | openssl base64 -d | openssl rsautl -decrypt -inkey private_key.pem
请记住,非对称加密算法的选择应基于安全需求、性能要求和兼容性考虑。对于需要长期安全的应用,推荐使用RSA-2048位以上,或者基于椭圆曲线的算法。