在当今数字化时代,信息的传递和存储成为了日常生活和商业活动的重要组成部分。然而,随之而来的安全威胁也愈发严重,为了保护敏感信息免受恶意攻击,非对称加密技术应运而生。本文将深入探讨非对称加密的基本含义、原理、起源,以及与对称加密的对比,旨在为读者提供对这一关键安全领域的深入了解。
非对称加密的基本含义
非对称加密,又称为公钥加密,采用了一对密钥,分别是公钥和私钥。与对称加密不同的是,这两个密钥是相关联的,但彼此之间不可逆推。数据加密时,使用公钥加密,而解密则需要相应的私钥。这种加密方式有效地解决了密钥传递的难题,成为了安全通信的基石。
非对称加密的原理
非对称加密基于数学上的一些难解问题,例如大数分解。其核心原理可以简单概括为:容易进行加密,难以进行解密。公钥用于加密,私钥用于解密,使得即便公钥泄露,攻击者也无法逆推出私钥,从而保障了信息的安全性。
起源与发展
非对称加密最早由英国数学家克里福德·考克斯(Clifford Cocks)在1973年提出,但直到1977年,美国数学家罗纳德·李维斯特(Ronald Rivest)、阿迪·萨莫尔(Adi Shamir)、伦纳德·阿德曼(Leonard Adleman)提出的RSA算法,非对称加密才开始进入大众视野。自此以后,非对称加密经过多次改进和演化,形成了今天广泛应用的多种算法,如DSA、ECC等。
与对称加密的对比
相较于对称加密,非对称加密的一大优势在于密钥的管理。对称加密需要在通信双方之间共享同一密钥,而非对称加密通过公钥和私钥的组合,避免了这一问题。此外,非对称加密还能够提供数字签名和数字证书等功能,进一步增强了通信的安全性。
然而,非对称加密也存在一些缺点,主要体现在计算成本较高和加密速度相对较慢。因此,在实际应用中,通常会将非对称加密与对称加密结合使用,发挥各自的优势,达到更好的安全性和效率平衡。
基本运行过程
非对称加密的基本运行过程可以简单概括为以下几个步骤:
-
密钥生成: 用户生成一对公钥和私钥,并将公钥传播给通信对方,私钥保留在本地。
-
加密: 发送方使用接收方的公钥对信息进行加密,并发送给接收方。
-
传输: 加密后的信息通过不安全的通道传输。
-
解密: 接收方使用自己的私钥对接收到的信息进行解密,获取原始信息。
通过以上步骤,通信双方能够在不共享密钥的情况下进行安全的信息传递。
非对称加密和对称加密的应用(tls)
http的传输层用的是tcp;
https用的是tls(加密)。
实验步骤
请求http://woniuxy.com,会重定向到https
后面的数据就可以通过S_key(对称密钥)进行加密了。
用Python实现TLS加密通信
#服务器端
import socket
import random
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
# 创建RSA密钥对
private_key_server = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key_server = private_key_server.public_key()
# 将公钥序列化为字节串,以便发送给客户端
public_key_bytes = public_key_server.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# 创建服务器socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 12345))
server_socket.listen(1)
# 接受客户端连接
print("Server is listening...")
connection, client_address = server_socket.accept()
# 发送公钥给客户端
connection.sendall(public_key_bytes)
# 接收客户端发送的随机数
random_number = connection.recv(1024)
print("Received random number from client:", random_number.decode())
# 使用私钥对随机数进行签名
signature = private_key_server.sign(
random_number,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# 发送签名给客户端
connection.sendall(signature)
# 关闭连接
connection.close()
server_socket.close()
#客户端
import socket
import random
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
# 创建客户端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(('127.0.0.1', 12345))
# 接收服务器发送的公钥
public_key_bytes = client_socket.recv(1024)
# 将服务器发送的公钥反序列化为RSA公钥对象
public_key_server = serialization.load_pem_public_key(
public_key_bytes,
backend=default_backend()
)
# 生成随机数
random_number = str(random.randint(1, 1000)).encode()
# 发送随机数给服务器
client_socket.sendall(random_number)
# 接收服务器发送的签名
signature = client_socket.recv(1024)
print("Received signature from server:", signature.hex())
# 使用服务器公钥验证签名
try:
public_key_server.verify(
signature,
random_number,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature verification successful.")
except:
print("Signature verification failed.")
# 关闭连接
client_socket.close()
结语
非对称加密作为信息安全的基石,在当今互联网时代扮演着不可替代的角色。通过深入了解其基本含义、原理、起源以及与对称加密的对比,我们能够更好地理解其在保障通信安全方面的价值。随着科技的不断进步,非对称加密算法也将不断演进,为信息安全提供更为坚固的保障。