def verify(message, signature, public_key): n, e = public_key m = int(message) s = pow(signature, e, n) return s == m
时间: 2023-12-22 19:04:33 浏览: 91
这是一个Python函数,用于使用RSA算法验证数字签名。函数使用公钥对签名进行验证,并返回签名是否有效。
函数定义:接受三个参数,一个为消息,一个为签名,一个为公钥,返回签名是否有效的布尔值。
函数实现:
```python
def verify(message, signature, public_key):
n, e = public_key
m = int(message)
s = pow(signature, e, n)
return s == m
```
函数说明:
1. 从公钥中提取出n和e,其中n为模数,e为公钥指数。
2. 将消息转换为整数m。
3. 对签名进行验证,即计算签名的e次方再对n取模,得到签名的原始消息。
4. 如果签名的原始消息与消息本身相等,则签名有效;否则签名无效。
5. 返回签名是否有效的布尔值。
需要注意的是,签名和公钥都是整数,需要将其转换为字符串或者字节数组进行传输和存储。
相关问题
用python实现S1. Alice和Bob通过运行Diffie-Hellman密码协商协议生成DES加密密钥。 S2. Alice将自己的公钥发送给Bob S3. Alice将秘密信息加密后传输给Bob S3.1 Alice将秘密信息,利用,加密为; S3.2 Alice利用MD5得到的哈希值; S3.3 Alice将自己的私钥对签名,结果为。 S3.4 Alice将发送给Bob。 S4. Bob解密收到的信息 S4.1 Bob利用MD5的哈希值; S4.2 Bob利用Alice的公钥,验证签名; S4.3 如果,则Break;否则继续进行S4.4; S4.4 利用解密,即可得到秘密消息M。
好的,这是一个很有趣的问题,我会尽力回答。首先,我们需要先了解Diffie-Hellman密码协商协议和DES加密算法的基本原理。
Diffie-Hellman密码协商协议是一种密钥交换协议,可以让双方在不安全的通信信道上协商出一个共同的密钥。它的基本原理是利用数学上的离散对数难题,使得双方都可以生成一个公钥和私钥,通过交换公钥来生成共同的密钥。
DES加密算法是一种对称密钥加密算法,它使用一个56位的密钥将64位的明文加密成64位的密文。DES算法被广泛应用于数据加密和保护。
现在我们来看看如何用Python实现这个流程。
首先,我们需要生成Diffie-Hellman密码协商协议的公钥和私钥:
```python
import random
import math
# 生成随机的质数p和原根g
def generate_p_and_g():
while True:
p = random.randint(100, 1000)
if is_prime(p):
break
while True:
g = random.randint(2, p-2)
if pow(g, (p-1)//2, p) == 1 and pow(g, 2, p) != 1:
break
return p, g
# 判断一个数是否为质数
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n))+1):
if n % i == 0:
return False
return True
# 生成公钥和私钥
def generate_keys(p, g):
a = random.randint(2, p-2)
A = pow(g, a, p)
return a, A
p, g = generate_p_and_g()
a, A = generate_keys(p, g)
```
接下来,Alice将自己的公钥A发送给Bob:
```python
# Alice将自己的公钥A发送给Bob
Bob_receive_A = A
```
然后,Alice将秘密消息M加密,并对加密后的消息进行签名:
```python
import hashlib
# DES加密算法
def des_encrypt(key, message):
# 这里省略DES加密算法的具体实现
return encrypted_message
# 生成MD5哈希值
def md5_hash(message):
hash_object = hashlib.md5(message.encode())
return hash_object.hexdigest()
# 对消息进行签名
def sign_message(private_key, message):
signature = pow(md5_hash(message), private_key)
return signature
# 加密消息并签名
key = pow(Bob_receive_A, a, p)
encrypted_message = des_encrypt(key, "Hello, Bob!")
signature = sign_message(a, encrypted_message)
```
接下来,Alice将加密后的消息和签名发送给Bob:
```python
# Alice将加密后的消息和签名发送给Bob
Bob_receive_encrypted_message = encrypted_message
Bob_receive_signature = signature
```
Bob收到Alice的消息后,首先要验证签名:
```python
# 验证签名
def verify_signature(public_key, signature, message):
if pow(signature, public_key) == md5_hash(message):
return True
else:
return False
if verify_signature(A, Bob_receive_signature, Bob_receive_encrypted_message):
print("Signature is valid.")
else:
print("Invalid signature.")
```
如果签名验证成功,Bob就可以解密收到的消息了:
```python
# 解密消息
key = pow(A, b, p)
decrypted_message = des_decrypt(key, Bob_receive_encrypted_message)
print("Decrypted message:", decrypted_message)
```
至此,我们就完成了这个流程。当然,这个实现只是一个简单的示例,实际应用中还需要考虑很多安全性和效率的问题。
python基于RSA算法的非对称数字签名,要求,p,q不需要大素数,普通素数即可,但p,q,e要求为可输入数字,认证信息为任意可输入数字
以下是基于RSA算法的非对称数字签名的Python代码示例:
```python
import random
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
def extended_gcd(a, b):
if a == 0:
return (b, 0, 1)
else:
gcd, x, y = extended_gcd(b % a, a)
return (gcd, y - (b // a) * x, x)
def mod_inv(a, m):
gcd, x, y = extended_gcd(a, m)
if gcd != 1:
raise Exception('Modular inverse does not exist')
else:
return x % m
def is_prime(n):
if n <= 1:
return False
elif n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
def generate_key(p, q, e):
if (not is_prime(p)) or (not is_prime(q)):
raise Exception('p or q is not prime')
n = p * q
phi = (p - 1) * (q - 1)
if gcd(phi, e) != 1:
raise Exception('e is not coprime to phi')
d = mod_inv(e, phi)
return ((n, e), (n, d))
def sign(message, private_key):
n, d = private_key
m = int(message)
return pow(m, d, n)
def verify(message, signature, public_key):
n, e = public_key
m = int(message)
s = pow(signature, e, n)
return s == m
# Example usage
p = 17
q = 19
e = 7
public_key, private_key = generate_key(p, q, e)
print('Public key:', public_key)
print('Private key:', private_key)
message = input('Enter message to sign: ')
signature = sign(message, private_key)
print('Signature:', signature)
valid = verify(message, signature, public_key)
if valid:
print('Signature is valid')
else:
print('Signature is not valid')
```
在代码中,`generate_key()`函数用于生成密钥对,`sign()`函数用于对消息进行签名,`verify()`函数用于验证签名。
需要注意的是,由于本算法不要求p,q为大素数,因此安全性较低,实际使用中应当使用大素数。同时,在签名时需要将待签名的消息转换为整数类型。
阅读全文