ElGamal加密、签名算法笔记
2019独角兽企业重金招聘Python工程师标准>>>
注意:只是个人理解,可能有不正确的地方
ElGamal加密算法是一种非对称加密算法,基于Diffie-Hellman密钥交换算法,由Taher Elgamal在1985年提出。
ElGamal加密算法可以应用在任意一个循环群(cyclic group)上。在群中有的运算求解很困难,这些运算通常与求解离散对数(Discrete logarithm)相关,求解的困难程度决定了算法的安全性。
群(Group)的定义:
群是数学中的概念。
一些元素组成的集合,如果元素满足以下条件,则把这些元素组成的集合叫做群:
在元素上可以定义一个2元运算,运算满足封闭性、结合律、单位元和逆元。
群的例子:
所有整数构成一个群,如果定义的2元运算为整数加法的话。加法可以满足上述条件:
封闭性:a+b之后仍然是整数
结合率:(a + b) + c = a +(b + c)
单位元:0 + a = a + 0 = a,则整数0为加法的单位元
逆元:a + b = b + a = 0,则整数b叫做整数a的逆元
所以可以简单的将群理解为一些元素的集合加上一个选定的运算方式。
循环群的定义:
循环群中的所有其它元素都是由某个元素g运用不同次数的选定运算方式计算出来的。
公钥生成:
1、选取一个循环群G,且循环群G的阶数为q
2、选择一个随机数x,1<x<q-1
3、计算h=g^x
h和g,G,q就构成公钥
x是保密的,x与h,g,G,q一起构成密钥
公钥加密:
1、选取一个随机数y,1<y<q-1
2、计算c1=g^y
3、计算s=h^y=(g^x)^y=g^(x*y)
4、加密数m得c2=m*s
c1、c2构成加密结果,交给私钥解密
私钥解密:
1、通过c1计算得到s=c1^x=(g^y)^x=g^(x*y)
2、计算c2*(s^-1)=(m*s)*(s^-1),得到原来数m
注意以上的运算不再是普通的乘(*)和乘方(^)运算,而且有循环群G对应的运算衍生出来的运算。但这些运算的意义和规律还是和普通数字运算的规律一样的,所以上面的等式仍然成立。
由上面看出s的计算过程和Diffie-Hellman密钥交换算法类似。
在应用中通常使用的循环群G为整数模n乘法群(Multiplicative group of integers modulo n)。
同余:
如果整数a、b的对于整数n的模相等即a%n=b%n,则称a和关于模n同余。可以记做:
a≡b (mod n)
互质(Coprime integers):
如果整数a、b的最大公因数为1,则a、b互质。
整数模n乘法群:由模n的互质同余类组成一个乘法群。
签名和验证算法,基于整数模n乘法群:
私钥,公钥生成:
1、选取一个随机数k,1<x<p-1
2、计算y=g^x%p
(g, p, y)为公钥,x为私钥。
用私钥签名:
1、选取一个随机数k,1<k<p-1,且k和p-1互质
2、计算r,r满足:r≡g^k (mod p)
3、计算s,s满足:s≡(H(m)-xr)*(k^(-1)) (mod p-1)
m为待签名信息,H(m)为m的哈希(比如sha1)结果。
(r,s)构成对m的签名
用公钥验证签名:
1、验证:0<r<p,0<s<p-1
2、验证:g^(H(m))≡(y^r)*(r^s) (mod p)
签名算法正确性证明:
由签名过程得:H(m) ≡s*k+x*r (mod p-1)
根据费马小定理:
g^(H(m))≡g^(x*r)*g^(k*s) (mod p)≡((g^x)^r)*(g^k)^s (mod p) ≡ (y^r)*(r^s) (mod p)
费马小定理:
如果p为质数,则任意整数a:
a^(p-1) ≡1 (mod p)
即存在整数k使 a^(p-1) = k*p +1
再广义化一些:
如果p为质数,且整数m、n满足:m ≡n (mod p-1),那么对任意整数a:
a^m ≡ a^n (mod p)
如果m=p-1,n=0,那么上市转换为一般形式:a^(p-1) ≡1 (mod p)
参考:
ElGamal加密算法: http://en.wikipedia.org/wiki/ElGamal_encryption
群: http://zh.wikipedia.org/wiki/%E7%BE%A4
循环群: http://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%BE%A4
同余运算: http://zh.wikipedia.org/wiki/%E5%90%8C%E9%A4%98
互质: http://zh.wikipedia.org/wiki/%E4%BA%92%E8%B3%AA
整数模n乘法群: http://zh.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E6%A8%A1n%E4%B9%98%E6%B3%95%E7%BE%A4
离散对数: http://en.wikipedia.org/wiki/Discrete_logarithm
Diffie-Hellman密钥交换算法: http://my.oschina.net/u/1382972/blog/330456
费马小定理: http://zh.wikipedia.org/wiki/%E8%B4%B9%E9%A9%AC%E5%B0%8F%E5%AE%9A%E7%90%86
转载于:https://my.oschina.net/u/1382972/blog/330630
ElGamal加密、签名算法笔记相关推荐
- 数字签名算法---加密学习笔记(五)
介绍 签名:就有安全性,抗否认性 数字签名:带有密钥(公钥,私钥)的消息摘要算法 作用: 1. 验证数据的完整性 2. 认证数据来源 3. 抗否认 数字签名遵循:私钥签名,公钥验证 常用的数字签名算法 ...
- ElGamal加密体制
ElGamal加密体制的公私密钥生成过程如下. (1)随机选择一个满足安全要求的大素数p,并生成有限域.的一个生成元: (2)选一个随机数x(1<r<p-1),计算,则公钥为(y,g,p) ...
- 【公钥密码】ECC椭圆密码体制 (实现Elgamal加密方法)
CryptoAlgor 项目地址 (四个实验完整源码) 1. Github 项目地址 2. Gitee 项目地址 该项目的目录: 1.四个古典密码 /classcipher ...
- 一款支持加密的笔记StandardNotes
什么是 Standard Notes ? Standard Notes 是一款免费.开源且完全加密的笔记应用程序,支持端到端加密,拥有强大的扩展程序.编辑器和主题,客户端跨平台,支持包括:Linux, ...
- elgamal签名算法c语言,ElGamal加密、签名算法笔记
注意:只是我的理解,可能有不正确的地方算法 ElGamal加密算法是一种非对称加密算法,基于Diffie-Hellman密钥交换算法,由Taher Elgamal在1985年提出.安全 ElGamal ...
- 非对称加密算法---加密学习笔记(四)
介绍: 非对称加密相对与对称加密算法来说是高级的. 举个双保险的例子: 银行的保险柜,客户往银行的保险柜存贵重东西,这个保险柜的钥匙会有两把,客户有一把,银行有一把.如果想打开保险柜就需要银行的钥匙和 ...
- python椭圆曲线加密算法_ECC椭圆曲线加密学习笔记
0x00 前言 之前做题的时候遇到一个ECC相关的题目,学习了好几篇大佬的文章ECC的剖析文章,学习之后也记录一下,写一遍加强自己的巩固. 此文章严格意义上来讲应该算是读书笔记,在总结过程中观摩了很多 ...
- linux通过SSH连接的SSH加密原理(笔记自用)
为了理解SSH,先要介绍两个重要概念:对称加密和非对称加密. 对称加密 在对称加密中,客户端和服务端使用同一个密钥对数据进行加密和解密.这种方法的好处是加密强度高,很难破解. 缺点也很明显,即密钥本身 ...
- 对称加密算法---加密学习笔记(三)
基本介绍 对称加密算法是现在应用范围最广,使用频率最高的加密算法. 对称的原因: 加密密钥 = 解密密钥,加密运算是解密运算的逆运算. 对称加密算法是初等的加密算法,从安全性上说,不是很高. 常用的对 ...
最新文章
- NLP界的「MVP」再次夺冠,刷新GLUE榜单
- msf rhosts设置文件_聊一聊基于 msf 的免杀项目测试过程
- LOJ #2731 [JOI2016春季合宿]Solitaire (DP、组合计数)
- c语言实现连续几个bit位置1,【C语言简单说】四:常量
- ntext在mysql_varchar和text说不清的那些事
- ECCV 2020 oral | 基于语义流的快速而准确的场景解析,在Cityscapes上达到80.4%mIoU,26 FPS...
- 测试人员必会用例设计方法 —— 正交表
- 使用procexp.exe查看线程
- QQ小程序激励广告接入与使用
- 尘埃4 for Mac(DiRT4赛车竞速游戏)原生版
- 【SpringBoot系列】自动装配原理
- GitHub设置代理 提升速度
- Python 分类问题研究-Fisher线性判别
- windows 10 git bash 提速方法
- 小程序(之音乐播放器实现思路)
- Qt程序在arm板上运行
- 计算机网络及多媒体知识,计算机基础知识:多媒体的基本概念及关键技术
- 如何学好 java?
- 32位、64位与Java开发研究分析
- AI+大数据:科技技术手段促使二手车电商的“升阶”战
热门文章
- LintCode 1.A+B的问题
- Python应用——自定义函数:分割PDF文件函数
- 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布...
- scanf函数与scanf_s函数
- Spring.net抛砖引玉系列(二)用接口来实现HelloWorld
- Webkit 最新 Javascript 引擎领先 Chrome
- Tesorflow源代码安装方式以及错误的解决方法
- android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
- 人力资源大数据解决方案
- android studio没有org.apache.http.client.HttpClient;等包问题 解决方案