import sysdef gcd(p, q): if q == 0: return p return gcd(q, p % q)p = int(sys.argv[1])q = int(sys.argv[2]) print(gcd(p, q))
时间: 2023-12-06 16:42:49 浏览: 58
这段代码实现了求两个数的最大公约数,其中 p 和 q 是从命令行参数中读入的。算法使用了辗转相除法,即不断用较小的数去除较大的数,直到两个数相等或者其中一个数变成0。如果其中一个数变成0,则另一个数即为最大公约数。如果两个数不相等,则用较小的数去减较大的数,再用这个差和较小的数继续进行辗转相除,直到两个数相等为止。最后的相等点即为最大公约数。
相关问题
python代码实现RSA,参数p、q由键盘输入,并进行注释
以下是Python代码实现RSA算法,其中p、q由键盘输入,代码中有注释说明各部分的功能:
```python
import random
# 判断一个数是否为素数
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
# 生成指定长度的素数
def generate_prime(length):
while True:
p = random.randint(10 ** (length - 1), 10 ** length - 1)
if is_prime(p):
return p
# 扩展欧几里得算法求逆元
def exgcd(a, b):
if b == 0:
return 1, 0, a
else:
x, y, gcd = exgcd(b, a % b)
x, y = y, (x - a // b * y)
return x, y, gcd
# 生成公钥和私钥
def generate_keypair(p, q):
n = p * q
phi_n = (p - 1) * (q - 1)
while True:
e = random.randint(2, phi_n - 1)
x, y, gcd = exgcd(e, phi_n)
if gcd == 1:
break
d = x % phi_n
return (e, n), (d, n)
# 加密
def encrypt(message, public_key):
e, n = public_key
cipher = pow(message, e, n)
return cipher
# 解密
def decrypt(cipher, private_key):
d, n = private_key
message = pow(cipher, d, n)
return message
if __name__ == '__main__':
# 从键盘输入两个素数p、q,生成公钥和私钥
p = int(input("请输入一个素数p:"))
q = int(input("请输入一个素数q:"))
public_key, private_key = generate_keypair(p, q)
# 输入明文并加密
message = int(input("请输入要加密的明文:"))
cipher = encrypt(message, public_key)
print("加密后的密文为:", cipher)
# 解密密文
decrypted_message = decrypt(cipher, private_key)
print("解密后的明文为:", decrypted_message)
```
注:此代码只是RSA的基本实现,实际应用中还需要考虑很多细节问题,如如何保护私钥安全、如何处理长文本、如何防范攻击等。
阅读全文