SecCrpytoExp-2

本文最后更新于:2023年6月19日 晚上

Elgamal 密码

首先用到了几个强大的库(避免重复造轮子)

1
2
import sympy
from Crypto.Util import number

sympy用于计算原根,它是一个强大的符号计算的 python 库。不仅可以像 mathematica 一样进行符号计算,也内置了很多的 OI 实用算法,包括图论、计算几何、数论、多项式等等很多方面。

更多用法可以看这里 https://2o181o28.github.io/2019/07/14/sympy%E7%9A%84OI%E7%94%A8%E6%B3%95/

Crypto则是更加强大的密码学库
然后就是 exp 了

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
'''
Author: M@tr1x
Date: 2020-11-06 17:15:32
LastEditTime: 2020-11-08 12:14:15
Description: Elgamal密码加解密程序
'''


import gmpy2
from Crypto.Util import number
import random
import sympy

class Elgamal():
def __init__(self,p_length):
self.p = number.getPrime(p_length)#a random prime number with 2 ^ p_length
self.x = random.randint(2,self.p-3)#private key
self.g = sympy.primitive_root(self.p)#the smallest primitive root
self.y = int(gmpy2.powmod(self.g,self.x,self.p))#public key y

def encrypt(self,m):
"""crypto function

Args:
m (num): plain decimal message

Returns:
y1,y2: encrypted k&m
"""
k = random.randint(1,self.p-2)
while int(gmpy2.gcd(k,self.p-1))!=1:
k = random.randint(1,self.p-2)
y1 = gmpy2.powmod(self.g,k,self.p)
y2 = (m%self.p)*int(gmpy2.powmod(self.y,k,self.p))%self.p
y1 = int(y1)

return y1,y2

def decrypt(self,y1,y2):
"""decrypto function

Args:
y1 (num):
y2 (num):

Returns:
m: plain message
"""
yi = int(gmpy2.invert(y1,self.p))
m = int(gmpy2.powmod(yi,self.x,self.p))*(y2%self.p)%self.p
return m


if __name__ == "__main__":
new_elgamal = Elgamal(50)
(y1,y2) = new_elgamal.encrypt(9999999)#encrypt 9999999
print("y1:"+str(y1))
print("y2:"+str(y2))
m = new_elgamal.decrypt(y1,y2)#decrypt y1&y2
print("m:"+str(m))

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!