1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
def f(r, x, n):
"""
Tính lũy thừa r của x theo mô đun n
"""
a = x
b = r
c = 1
while b != 0:
while [j8bet com](/hy/6cb5ad08.html) b % 2 == 0:
b = b // 2
a = (a * a) % n
if b % 2 != 0:
b = b - 1
c = (c * a) % n
return c
def Enclid(n, d):
"""
Tính toán nghịch đảo mô đun
"""
a = n
b = d
t = 0
v = 1
w = 0
while True:
r = a % b
if r != 0:
q = (a - r) // b
a = b
b = r
w = v
v = t - q * v
t = w
else:
break
if [iwin68.club phiên bản mới](/hy/e7a38f19.html) b == 1:
if v >= 0:
return v
else:
return n + v
else:
return 0
def gcd(a, b):
"""
Tính ước số chung lớn nhất
"""
r = a % b
while True:
r = a % b
if r != 0:
a = b
b = r
else:
break
if b == 1:
return 1
else:
return b
def rsa():
"""
Thuật toán mã hóa RSA
"""
# Nhập hai số nguyên tố p, q
p = int(input("Nhập hai số nguyên tố:(p, q)\n"))
q = int(input())
n = p * q # Tính n
fn = (p - 1) * (q - 1) # Tính φ(n)
# Nhập e và đảm bảo gcd(fn, e) = 1
e = int(input("Nhập e:\n"))
while True:
if gcd(fn, e) == 1:
break
else:
e = int(input("Phải thỏa mãn gcd(fn,e)=1\n"))
# Tính d
d = Enclid(fn, e)
# Xuất khóa công khai và khóa riêng tư
if d == 0:
print("Có lỗi xảy ra!\n")
else:
print("Khóa công khai(%d,%d)\n" % (e, fn))
print("Khóa riêng tư:(%d,%d)\n" % (d, fn))
# Nhập bản rõ m và đảm bảo m < p * q
m = int(input("Enc: Nhập bản rõ:\n"))
while m >= p * q:
print("Lỗi! Bản rõ cần nhỏ hơn p*q=%d!\n" % (p * q))
m = int(input())
# Mã hóa và xuất bản mã
print("Bản mã:%d\n" % f(e, m, n))
# Giải mã và xuất bản rõ
print("Giải mã:m=%d\n" % f(d, f(e, m, n), n))
print("Thuật toán mã hóa RSA\n")
print("Họ [j88vip0](/hy/bd3810d9.html) tên: W1ndys\n")
print("Mã sinh viên: 10000001\n")
rsa()
input("Nhấn Ctrl+C để thoát")
|