公钥加密算法
公钥加密算法,也被称为非对称加密算法,是现代加密技术的核心概念。与传统的对称加密算法不同,非对称加密使用一对密钥:一个公钥和一个私钥。以下是公钥加密算法的基本思想和工作原理:
-
密钥对:在非对称加密中,生成两个密钥。其中一个是公开的,称为公钥;另一个是保密的,称为私钥。这两个密钥是数学上相关的,但在现实情况下,从公钥计算私钥是不切实际的。
-
加密和解密:
- 使用公钥加密:任何人都可以使用公钥来加密信息,但只有私钥的持有者才能解密它。
- 使用私钥加密:私钥的持有者可以使用它来加密信息,然后任何人都可以使用相应的公钥来解密它。这种方法常用于数字签名,而不是加密。辨认一个消息是否是来自于某人,只要用对应的公钥试一试看能不能解密就行了。先签名,再加密。再解密,再验证签名。
-
数字签名:除了加密功能外,非对称加密也用于数字签名。签名是使用私钥对数据的摘要进行加密的过程。接收方可以使用公钥解密并验证签名,从而验证数据的完整性和来源。
-
性能:由于涉及到复杂的数学运算,公钥加密通常比对称加密要慢得多。因此,在实际应用中,常常使用公钥加密来加密对称密钥,然后使用这个对称密钥来加密实际的数据。
-
密钥管理:公钥加密简化了密钥管理的问题。因为公钥可以被公开,所以只需要保护私钥。而在对称加密中,加密和解密使用同一个密钥,如果需要与多人或多个组织共享,密钥管理就会变得复杂。
-
证书和公钥基础设施(PKI):为了验证公钥的所有者,可以使用证书。证书是由可信任的第三方机构(如证书颁发机构)签发的,证明特定的公钥确实属于声明的持有者。PKI是管理这些证书的结构和策略。
公钥加密算法的著名例子包括RSA、ElGamal和Elliptic Curve Cryptography(ECC)。这些算法都为提供安全通信、数据保护和数字签名提供了坚实的基础。
RSA概念
- 数据库通常包含敏感数据,如用户密码、财务信息等。尽管对称加密(如AES)是数据库加密的主要方法,但公钥加密在某些场景下也很有用。
- 比如,用户密码可以通过公钥加密存储,然后只有拥有私钥的授权实体可以访问原始密码。
- 在客户端和数据库服务器之间建立安全连接时,SSL/TLS(使用公钥加密技术)通常用于初始的握手过程,以安全地交换对称密钥。
RSA的Python实践
二话不说,上代码:
import rsa
def generate_keypair(bits=2048):
"""
生成RSA密钥对。
"""
(public_key, private_key) = rsa.newkeys(bits)
return private_key, public_key
def encrypt_with_public_key(public_key, plaintext):
"""
使用公钥加密明文。
"""
try:
encrypted_data = rsa.encrypt(plaintext.encode(), public_key)
return encrypted_data
except Exception as e:
print(f"Error encrypting message: {e}")
return None
def decrypt_with_private_key(private_key, encrypted_data):
"""
使用私钥解密密文。
"""
try:
decrypted_data = rsa.decrypt(encrypted_data, private_key).decode()
return decrypted_data
except Exception as e:
print(f"Error decrypting message: {e}")
return None
if __name__ == '__main__':
private_key, public_key = generate_keypair()
print("Private Key:", private_key)
print("Public Key:", public_key)
message = "Hello, RSA!"
encrypted_message = encrypt_with_public_key(public_key, message)
if encrypted_message:
print("Encrypted:", encrypted_message)
decrypted_message = decrypt_with_private_key(private_key, encrypted_message)
if decrypted_message:
print("Decrypted:", decrypted_message)
很明显,首先,生成公钥私钥,再利用公钥加密,私钥解密。其结果图如下:
Private key和Public key很长很长……