非对称加密算法代码实现
时间: 2023-06-10 09:06:19 浏览: 126
非对称加密算法是一种使用公钥和私钥来实现加密和解密的算法。其中,公钥可以公开,用于加密消息;私钥必须保密,用于解密消息。目前较为常见的非对称加密算法有RSA、ECC等。
下面以RSA算法为例,提供一份Python代码实现:
```python
import random
from math import gcd
def get_random_prime(bits):
"""
生成指定位数的随机质数
"""
while True:
p = random.randint(2**(bits-1), 2**bits - 1)
if is_prime(p):
return p
def is_prime(n, k=5):
"""
Miller-Rabin素性测试
"""
if n == 2 or n == 3:
return True
if n < 2 or n % 2 == 0:
return False
d = n - 1
r = 0
while d % 2 == 0:
r += 1
d //= 2
for _ in range(k):
a = random.randint(2, n - 2)
x = pow(a, d, n)
if x == 1 or x == n - 1:
continue
for _ in range(r - 1):
x = pow(x, 2, n)
if x == n - 1:
break
else:
return False
return True
def get_keys(key_size):
"""
生成RSA公钥和私钥
"""
p = get_random_prime(key_size // 2)
q = get_random_prime(key_size // 2)
n = p * q
phi_n = (p - 1) * (q - 1)
while True:
e = random.randrange(2**(key_size - 1), 2**key_size - 1)
if gcd(e, phi_n) == 1:
break
d = modinv(e, phi_n)
return (e, n), (d, n)
def modinv(a, m):
"""
求a在模m意义下的逆元
"""
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
g, x, y = egcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
else:
return x % m
def encrypt(pk, plaintext):
"""
使用公钥加密明文
"""
e, n = pk
ciphertext = [pow(ord(char), e, n) for char in plaintext]
return ciphertext
def decrypt(pk, sk, ciphertext):
"""
使用私钥解密密文
"""
d, n = sk
plaintext = [chr(pow(char, d, n)) for char in ciphertext]
return ''.join(plaintext)
```
使用示例:
```python
# 生成公钥和私钥
public_key, private_key = get_keys(1024)
# 使用公钥加密消息
message = "Hello, World!"
ciphertext = encrypt(public_key, message)
# 使用私钥解密消息
plaintext = decrypt(public_key, private_key, ciphertext)
print(plaintext) # 输出:Hello, World!
```
需要注意的是,RSA算法中的key_size参数需要根据具体情况进行调整,一般建议使用2048位或以上的密钥。同时,该代码实现中还使用了Miller-Rabin素性测试和扩展欧几里得算法求模反元素,以提高算法的安全性和效率。
阅读全文