deflegal(p, q): if p == q: print("两数相等,请重新输入") generate_keys() elif p <= 2or q <= 2: print("应输入大于2的质数,请重新输入") generate_keys() else: n = p * q return n
deflegal2(n): if n <= 2: print("应输入大于2的整数,请重新输入") generate_keys()
defgcd(e, phi): if e == 0: return (phi, 0, 1) else: g, y, x = gcd(phi % e, e) return (g, x - (phi // e) * y, y)
defgenerate_keys(): p = int(input("请输入第一个质数(如10957):") or'10957') q = int(input("请输入第二个质数(如10973):") or'10973') e = int(input("请输入公钥(一般为65537):") or'65537') n = legal(p, q) legal2(e) phi = (p - 1) * (q - 1) g, x, y = gcd(e, phi) if g != 1: print(f"e 和 φ(n) 不互质:gcd({e},{phi})!=1,请重新输入") generate_keys() else: d = x % phi
return (n, e, d)
defencrypt(n, e): m = int(input("请输入要加密的明文:")) if m > n: raise ValueError("明文m必须小于n") c = pow(m, e, n) return c
defdecode(n, d): c = int(input("请输入要解密的密文:")) if c > n: raise ValueError("密文c必须小于n") m = pow(c, d, n) return m
n, e, d = 0, 0, 0
defUI(n, e, d): print("——————————RSA加密算法——————————") print("1.生成密钥") print("2.加密") print("3.解密") print("4.重置") state = int(input("请输入需要进行的操作:")) if state == 1: n, e, d = generate_keys() print(f"生成公钥为:({n},{e})") print(f"生成私钥为:({n},{d})") input("按任意键继续...") UI(n, e, d) elif state == 2: c = encrypt(n, e) print("加密后密文为:", c) UI(n, e, d) elif state == 3: m = decode(n, d) print("解密后明文为:", m) UI(n, e, d) elif state == 4: UI(0,0,0) else: print("操作不存在,请重新输入") UI(n,e,d)
deflegal(p, q): if p == q: print("两数相等,请重新输入") generate_keys() elif p <= 2or q <= 2: print("应输入大于2的质数,请重新输入") generate_keys() else: n = p * q return n
deflegal2(n): if n <= 2: print("应输入大于2的整数,请重新输入") generate_keys()
defgcd(e, phi): if e == 0: return (phi, 0, 1) else: g, y, x = gcd(phi % e, e) return (g, x - (phi // e) * y, y)
defgenerate_keys(): p = int(input("请输入第一个质数(如10957):") or'10957') q = int(input("请输入第二个质数(如10973):") or'10973') e = int(input("请输入公钥(一般为65537):") or'65537') n = legal(p, q) legal2(e) phi = (p - 1) * (q - 1) g, x, y = gcd(e, phi) if g != 1: print(f"e 和 φ(n) 不互质:gcd({e},{phi})!=1,请重新输入") generate_keys() else: d = x % phi
return (n, e, d)
defstring_to_numbers(s): """将字符串转换为整数序列""" return [ord(char) for char in s]
defnumbers_to_string(numbers): """将整数序列转换回字符串""" return''.join(chr(number) for number in numbers)
defencrypt_string(s, n, e): """加密字符串""" numbers = string_to_numbers(s) encrypted_numbers = [pow(num, e, n) for num in numbers] return encrypted_numbers
defdecrypt_string(encrypted_numbers, n, d): """解密整数列表,并转换回字符串""" numbers = [pow(c, d, n) for c in encrypted_numbers] return numbers_to_string(numbers)
n, e, d = 0, 0, 0
defUI(n, e, d): print("——————————RSA加密算法——————————") print("1.生成密钥") print("2.加密") print("3.解密") print("4.重置") state = int(input("请输入需要进行的操作:")) if state == 1: n, e, d = generate_keys() print(f"生成公钥为:({n},{e})") print(f"生成私钥为:({n},{d})") input("按任意键继续...") UI(n, e, d) elif state == 2: s = input("请输入要加密的明文:") encrypted_numbers = encrypt_string(s, n, e) print("加密后密文为:", encrypted_numbers) UI(n, e, d) # 传递加密后的整数列表以便解密
elif state == 3: # 假设用户将以逗号分隔的密文输入进行解密 encrypted_input = input("请输入以逗号分隔的密文进行解密(例如:1,2,3):").strip() encrypted_numbers = list(map(int, encrypted_input.split(','))) m = decrypt_string(encrypted_numbers, n, d) print("解密后明文为:", m) input("按任意键继续...") UI(n, e, d) elif state == 4: UI(0, 0, 0) else: print("操作不存在,请重新输入") UI(n, e, d)