RSAアルゴリズム実装(Python版)
2925 ワード
暗号化={対称暗号化、非対称暗号化}
対称暗号化の効率は非対称暗号化よりも高い.対称暗号化アルゴリズムを用いて非対称暗号化の鍵を協議し、非対称暗号化でデータを伝送するのに便利である.
非対称暗号化アルゴリズムには多くの実装アルゴリズムがあり、RSAはその1つである(RとSは不可逆式one-way functionを計算したいが、数学者Aは式を探す不足である).
非対称暗号化アルゴリズムステップ:鍵ペアを生成し、公開鍵を配布し、暗号化し、復号する.用途:暗号化伝送、デジタル署名.
RSAは離散対数の実現に基づいて、ウィキペディアRSAに移行することを設計し、証明する.以下は百科事典を見て自分でPython 3で試したコードリストです.
来たからには安泰だ.学校が始まって授業を選んで、私の推定したのはネット空間の安全を専攻しなければならなくて、将来運維に従事して、開発職に縁がありません(やはりこっそりJavaを学ぶことができます)
対称暗号化の効率は非対称暗号化よりも高い.対称暗号化アルゴリズムを用いて非対称暗号化の鍵を協議し、非対称暗号化でデータを伝送するのに便利である.
非対称暗号化アルゴリズムには多くの実装アルゴリズムがあり、RSAはその1つである(RとSは不可逆式one-way functionを計算したいが、数学者Aは式を探す不足である).
非対称暗号化アルゴリズムステップ:鍵ペアを生成し、公開鍵を配布し、暗号化し、復号する.用途:暗号化伝送、デジタル署名.
RSAは離散対数の実現に基づいて、ウィキペディアRSAに移行することを設計し、証明する.以下は百科事典を見て自分でPython 3で試したコードリストです.
import random
class RSA:
def is_prime(self, n):
'''primality test'''
if n <= 3:
return n > 1
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 gcd(self, a, b):
''' a、b '''
return a if b == 0 else self.gcd(b, a % b)
def lcm(self, a, b):
''' a、b '''
return a // self.gcd(a, b) * b
def ex_gcd(self, a, b, d, x, y):
'''
,(x + b) % b (a % b)
'''
if b == 0:
d[0], x[0], y[0] = a, 1, 0
else:
self.ex_gcd(b, a % b, d, y, x)
y[0] -= a // b * x[0]
def quick_power(self, a, b, mod):
res = 1
while b != 0:
if (b & 1) == 1:
res = (res * a) % mod
a = a * a % mod
b >>= 1
return res
def generate(self):
'''
Generates a k-bit RSA public/private pair
@param
@returns
'''
p, q = 10000079, 10000943
# p、q , n , n
# , p、q
lambdan = self.lcm(p - 1, q - 1)
e = 0
while not self.is_prime(e):
e = random.randint(2, lambdan - 1)
d = [0]
self.ex_gcd(e, lambdan, [0], d, [0])
d = d[0] % lambdan
return {
'n': p * q, # public key (part I)
'e': e, # public key (part II)
'd': d, # private key
}
def encrypt(self, m, e, n):
'''
m, e, n
'''
c = self.quick_power(m, e, n)
return c
def dencypt(self, c, d, n):
m = self.quick_power(c, d, n)
return m
if __name__ == "__main__":
alice = RSA()
bob = RSA()
keys = alice.generate()
msg = 878089
'''bob alice ,alice '''
c = bob.encrypt(m=msg, e=keys['e'], n=keys['n'])
m = alice.dencypt(c, d=keys['d'], n=keys['n'])
assert msg == m
print(msg, m)
来たからには安泰だ.学校が始まって授業を選んで、私の推定したのはネット空間の安全を専攻しなければならなくて、将来運維に従事して、開発職に縁がありません(やはりこっそりJavaを学ぶことができます)