RSA、Elgamal、ECC等加密解密过程以及相应的数字签名(无证明过程)

573 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

RSA

RSA加密解密
  • 描述: RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式破解。到当前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被破解的。
  • 目的:A想要给B发送一条只有他们两人知道的消息m
  • 公开:公钥{n,e}
  • 保密:私钥{d},p,q
  • 参数解释:p、q是两个大素数,至于怎么生成大素数,暂时先不要管,之后我会在写博客,然后把连接赋过来(也可以去搜素性检验);n=p*q,那么相应的就有φ(n)=(p1)(q1)\varphi(n)=(p-1)*(q-1),取gcd(e,φ(n))=1gcd(e,\varphi(n))=1,那么则求出d:ed1mod φ(n)e*d\equiv 1 mod\ \varphi(n),产生e,d之后即可销毁p,q
  • 密钥生成:ed1mod φ(n)e*d\equiv 1 mod\ \varphi(n),e为公钥,d为私钥
  • 加密过程:cme mod nc\equiv m^e \ mod\ n
  • 解密过程:mcd mod nm\equiv c^d \ mod\ n
  • 证明:略
RSA数字签名
  • 描述: 数字签名(英语:Digital Signature,又称公钥数字签名)是一种功能类似写在纸上的普通签名、但是使用了公钥加密领域的技术,以用于鉴别数字信息的方法。一套数字签名通常会定义两种互补的运算,一个用于签名,另一个用于验证。法律用语中的电子签章与数字签名代表之意义并不相同。电子签章指的是依附于电子文件并与其相关连,用以辨识及确认电子文件签署人身份、资格及电子文件真伪者;数字签名则是以数学算法或其他方式运算对其加密而形成的电子签章。意即并非所有的电子签章都是数字签名。 数字签名不是指将签名扫描成数字图像,或者用触摸板获取的签名,更不是落款。 数字签名了的文件的完整性是很容易验证的(不需要骑缝章、骑缝签名,也不需要笔迹鉴定),而且数字签名具有不可抵赖性(即不可否认性),不需要笔迹专家来验证。
  • 目的:拥有A的签名的文件,数据,无法被伪造,能唯一确认并简易验证
  • 公开:公钥{n,e}
  • 保密:私钥{d},p,q
  • 参数解释:p、q是两个大素数,至于怎么生成大素数,暂时先不要管,之后我会在写博客,然后把连接赋过来(也可以去搜素性检验);n=p*q,那么相应的就有φ(n)=(p1)(q1)\varphi(n)=(p-1)*(q-1),取gcd(e,φ(n))=1gcd(e,\varphi(n))=1,那么则求出d:ed1mod φ(n)e*d\equiv 1 mod\ \varphi(n),产生e,d之后即可销毁p,q
  • 签名过程:xdy mod nx^d \equiv y\ mod\ n ,对消息x的签名y
  • 验证过程:yex mod ny^e \equiv x\ mod\ n,对签名y的认证

有没有这样的疑问,在A向B发送消息的时候,是先加密再签名还是先签名再加密? 正确的答案应该是:前签名后加密!! 因为签名是任何人都能够解开的,如果把签名放到最后,被敌手截获,那么敌手解开a的签名后,再对中间密文进行一次自己的(别人的)签名,然后发给接收方,那么接收方B收到的A的消息就无法进行验证解密了;

Elgamal

Elgamal加密解密
  • 描述: 在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。[1]GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法。 ElGamal加密算法可以定义在任何循环群{\displaystyle G}上。它的安全性取决于{\displaystyle G}上的离散对数难题。ElGamal加密算法由三部分组成:密钥生成、加密和解密。
  • 公开:{p,g,y}
  • 保密:{x}
  • 参数解释:p是一个大素数,g是Zp*中的生成元,x与y满足:x属于Zp1Z_{p-1}ygxmod py\equiv g^x mod\ p
  • 密钥生成:ygxmod py\equiv g^x mod\ p,y为公钥,x为私钥
  • 加密过程: 随机选取一个整数k,k属于Zp1Z_{p-1} rgkmod pr\equiv g^k mod\ p smykmod ps\equiv m*y^k mod\ p 加密后的密文为(r,s)
  • 解密过程:ms(rx)1mod pm\equiv s*(r^x)^{-1} mod\ p
Elgamal签名
  • 公开:{p,g,y}
  • 保密:{x}
  • 签名过程: 随机选取一个整数k,k属于Zp1Z_{p-1} rgkmod pr\equiv g^k mod\ p s(h(m)xr)k1mod p1s\equiv (h(m)-xr)k^{-1} mod\ p-1 ,h是Hash函数 得到关于m的签名,(r,s)
  • 验证过程:yrrsgh(m)mod py^r*r^s\equiv g^{h(m)} mod\ p
类Elgamal签名
  • 公开:{p,q,g,y}
  • 保密:{x}
  • 参数说明: p,q是大素数,且q | p-1 随机选取q阶元g 随机选取x,x<=q-1,计算ygxmod py\equiv g^x mod\ p
  • 签名过程: 得到h(m) rgkmod pr\equiv g^k mod\ pakb+cxmod qak \equiv b + cx mod\ q中,计算出s,即{a,b,c}和{r,s,h(m)}对应
  • 验证过程:gbycramod pg^b*y^c\equiv r^a mod\ p

ECC

ECC加密解密
  • 描述: 椭圆曲线密码学(英语:Elliptic Curve Cryptography,缩写:ECC)是一种基于椭圆曲线数学的公开密钥加密算法。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。 ECC的主要优势是在某些情况下它比其他的算法(比如RSA加密算法)使用更小的密钥并提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。椭圆曲线密码学的许多形式有稍微的不同,所有的都依赖于被广泛承认的解决椭圆曲线离散对数问题的困难性上,对应有限域上椭圆曲线的群。

  • 椭圆曲线方程:y2=x3+ax+by^2=x^3+ax+b

  • 公开{p,G,a,b,Y}

  • 保密{x}

  • 参数说明,p为一个大素数,G是循环群的阶为n(大素数)的生成元,a,b是方程的参数,Y=xG,x为私钥,Y为公钥

  • 加法运算规则 在这里插入图片描述

  • 加密过程: 对明文m镶嵌到椭圆曲线上 在这里插入图片描述 随机选取k<n,这个k与上面的不一样 C1=kGC_1 = kG C2=Pm+kYC_2 = P_m+kY 得出密文:(C1,C2)(C_1,C_2)

  • 解密过程:Pm=C1xC2P_m=C_1-x*C_2

DSA

DSA签名
  • 描述: 数字签名算法(DSA)是用于数字签名的联邦信息处理标准,基于模算数和离散对数的复杂度。DSA是Schnorr和ElGamal签名方案的变体。 美国国家标准技术研究所(NIST)于1991年提出将DSA用于其数字签名标准(DSS),并于1994年将其作为FIPS 186采用。[2]已对初始规范进行了四次修订。DSA已获得专利,但NIST已将此专利在全球范围内买断式授权。 DSA的椭圆曲线密码学版本是ECDSA。DSA算法工作在框架公钥加密、模算数和离散对数问题,这被认为是难解问题。该算法使用由公钥和私钥组成的密钥对。私钥用于生成消息的数字签名,并且可以通过使用签名者的相应公钥来验证这种签名。数字签名提供信息鉴定(接收者可以验证消息的来源),完整性(接收方可以验证消息自签名以来未被修改)和不可否认性(发送方不能错误地声称它们没有签署消息)。
  • 公开:{p,q,g,y}
  • 保密:{x}
  • 参数说明: 512<=L<=1024,L是64的倍数,选取大素数2L1<p<2l2^{L-1}<p<2^l,另外一个大素数q | p-1,q是160比特 随机选取h,h<p-1,g=h(p1/q)mod pg= h^{(p-1/q)} mod\ p 随机选取x,x<p ,y=gx mod py=g^x\ mod\ p,y为公钥,x为私钥
  • 签名过程: r=gkmod p mod qr= g^k mod\ p\ mod\ q s=(h(m)+xr)k1 modqs=(h(m)+xr)k^{-1}\ mod q dss的hash函数为SHA-1
  • 验证过程: u1=h(m)s1 mod qu_1=h(m)s^{-1}\ mod\ q u2=rs1 mod qu_2=r*s^{-1}\ mod\ q gu1yu2 mod p mod q=rg^{u_1}*y^{u_2}\ mod\ p\ mod\ q=r