最近有好多晚自习,好喜欢,有好多时间学密码,哈哈哈哈哈哈(已疯
上代码
签名部分原理依据:密码学——elgama加解密及数字签名算法_elgamal签名算法-CSDN博客
应用
1 | """ |
EXP
1 | from Crypto.Util.number import * |
敲代码的思路图
ElGamal密码算法
部分参考:密码学——elgama加解密及数字签名算法_elgamal签名算法-CSDN博客
参数
- p:大素数
- g,x:两个小于p的随机数
- y: $y = g^x \mod p$
- (y,g,p)作为公钥,x是私钥
- k:临时密钥,小于p,并且与p-1互质的随机数
- entropy:小于p,且与p-1互质的随机数,用于签名
- r: $r = g^{entropy} \mod p$,用于签名
加密
C = (c1, c2)
解密
并没有什么原理,只是关系式而已
数字签名
回顾一下参数
- entropy:小于p,且与p-1互质的随机数,用于签名
- r: $r = g^{entropy} \mod p$,用于签名
如果我k和entropy相等会怎么样
生成
计算m的哈希值,获得hm
签名为(r,s)
签名验证
计算接收到明文(具体要不要包含签名视情况而定,即看代码)的哈希值$hm’$
计算由签名得出的g1(包含对方私钥确认信息$x$)
由接收得到的明文计算g2
比较g1与g2是否相等
原理
没有数学原理,都是套关系。
分组
经过实验,p为1024位时,每次可加密128字节的明文,所以分组的代码为
1 | block = [send_message[i:i+128] for i in range(0, len(send_message), 128)] |