ECC & RSA

了解公钥密码学的人应该都听说过ECC、ECDH或是ECDSA。ECC是椭圆曲线密码学(Elliptic Curve Cryptography) 的缩写,后两个是基于它的算法名称。

在ECC流行起来之前,几乎所有的公钥算法都是基于RSA、DSA和DH———基于模运算的可选加密系统。RSA及其友类算法在当前仍非常重要,经常与ECC一并使用。RSA及其友类算法背后的原理利用"质因数分解"的复杂度问题,一些简单的实现很容易编写和理解;ECC的实现利用"椭圆曲线上的离散对数问题",相对复杂些。

  1. TLS握手中的非对称加密操作既花时间又是计算密集型的。随着椭圆曲线密码学的出现,ECC密钥被用作物联网设备身份的根源。256位ECC密钥提供与3072位RSA密钥相同的加密强度,但生成成本较低。CPU周期以及所需的内存占用空间也较低,从而使SSL证书处理时间提高了200%。
  2. ECC支持现在的操作系统,在SSL库和加密软件堆栈中是通用的。因此,受限的物联网设备现在可以更轻松地生成自己的私钥,执行验证操作并且更安全,同时使用更少的CPU和内存,从而节省能源。
一种关于密码学的碳排放量的衡量。
  1. 通过这样的测量方法,破解一个228字节的RSA秘钥所需能量少于煮沸一勺水的能量。相对地,破解一个228字节的椭圆曲线秘钥所需能量足够煮沸地球上所以水。而RSA要达到这样的安全强度,需要2,380个字节的秘钥长度。
  2. 使用ECC可以用更简短的秘钥获得相同的安全强度。简短秘钥是非常重要的,尤其是在现实中密码学算法越来越多的运行在小功率设备里,例如手机。
  3. 尽管两质数相乘比把结果因式分解要简单,但当质数变得非常大,在低功率设备上仅仅只是乘法步骤都将花费很长一段时间来计算。虽然可以通过增加秘钥长度来保持RSA的安全性,但却是以牺牲客户端的性能为代价。ECC提供了一个较好的选择:使用简短并且快速的秘钥来达到高安全性。

TLS中的ECC和RSA

使用HTTPS访问web
  • 用RSA的网站使用ECDHE_RSA是因为他们的SSL证书是RSA秘钥对。
  • 现在的浏览器也支持基于椭圆曲线密钥对的认证证书。如果网站的SSL证书是一个椭圆曲线密钥对的证书,这个页面将被声明为ECDHE_ECDSA。服务器的身份验证将会用ECDSA(椭圆曲线数字签名算法)来认证。
  • 使用ECDSA对性能改善显著超过了RSA。即使与一个没有最佳编译优化的椭圆曲线代码的旧版OpenSSL相比,一个256字节秘钥的ECDSA签名要比一个2048字节秘钥的RSA签名快过20倍。
  • 在TLS1.2的握手过程,在 Client Hello 和 Server Hello 里用到了ECDHE算法做密钥交换,参数完全公开,但却能够防止黑客攻击,只有通信双方才能知道的Pre-Master,这是 TLS 握手的关键步骤。

DH、DHE、ECDH、ECDHE

离散对数:

离散对数DH 算法是一种非对称加密算法,只能用于密钥交换,它的数学基础是“离散对数”(Discrete logarithm)

  • 什么是离散对数呢?上中学的时候我们都学过初等代数,知道指数和对数,指数就是幂运算,对数是指数的逆运算,是已知底数和真数(幂结果),反推出指数。例如,如果以 10 作为底数,那么指数运算是 y=10^x,对数运算是 y=logx,100 的对数是 2(10^2=100,log100=2),2 的对数是 0.301(log2≈0.301)。
  • 对数运算的域是实数,取值是连续的,而“离散对数”顾名思义,取值是不连续的,数值都是整数,但运算具有与实数对数相似的性质。
  • 离散对数里的一个核心操作是模运算,也就是取余数(mod,在 C、Java、Lua等语言里的操作符是“%”)。假设有模数 17,底数 5,那么“5 的 3 次方再对 17 取余数得 6”(5 ^ 3 % 17 = 6)就是在离散整数域上的一次指数运算(5 ^ 3 (mod 17) = 6)。反过来,以 5 为底,17 为模数,6 的离散对数就是 3(Ind(5, 6) = 3 ( mod 17))。这里的(17,5)是离散对数的公共参数,6 是真数,3 是对数。知道了对数,就可以用幂运算很容易地得到真数,但反过来,知道真数却很难推断出对数,于是就形成了一个“单向函数”。
  • 在这个例子里,选择的模数 17 很小,使用穷举法从 1 到 17 暴力破解也能够计算得到 6 的离散对数是 3。但如果我们选择的是一个非常非常大的数,比如说是有 1024 位的超大素数,那么暴力破解的成本就非常高了,几乎没有什么有效的方法能够快速计算出离散对数,这就是 DH 算法的数学基础。
DH 算法:

假设Alice和Bob约定使用DH算法来交换密钥。

  • 基于离散对数,Alice 和 Bob需要首先确定模数和底数作为算法的参数,这两个参数是公开的,用P和G来代称,简单起见我们还是用 17和5(P=17,G=5)。
  • 然后Alice和Bob各自选择一个随机整数作为私钥(必须在1和P-2之间),严格保密。比如 Alice 选择 a=10,Bob 选择 b=5。
  • 有了 DH 的私钥,Alice和Bob再计算幂作为公钥,也就是 A = (G ^ a % P) = 9,B = (G ^ b % P) = 14,这里的A和B完全可以公开,因为根据离散对数的原理,从真数反向计算对数 a 和 b 是非常困难的。
  • 交换 DH 公钥之后,Alice手里有五个数:P=17,G=5,a=10,A=9,B=14,然后执行一个运算:(B ^ a % P)= 8。因为离散对数的幂运算有交换律,B ^ a = (G ^ b ) ^ a = (G ^ a) ^ b = A ^ b,所以 Bob 计算 A ^ b % P 也会得到同样的结果 8,
  • 这就是Alice和Bob之间的共享秘密,可以作为会话密钥使用,也就是TLS里的Pre-Master。

那么黑客在这个密钥交换的通信过程中能否实现攻击呢?

整个通信过程中,Alice 和 Bob 公开了 4 个信息:P、G、A、B,其中 P、G 是算法的参数,A 和 B 是公钥,而 a、b是各自秘密保管的私钥,无法获取,所以黑客只能从已知的 P、G、A、B 下手,计算 9 或 14 的离散对数。由离散对数的性质就可以知道,如果 P 非常大,那么他很难在短时间里破解出私钥 a、b,所以 Alice 和 Bob 的通信是安全的(但在本例中数字小,计算难度很低)。

DHE算法:

DH 算法有两种实现形式,一种是已经被废弃的 DH 算法,也叫 static DH 算法,另一种是现在常用的 DHE 算法(有时候也叫 EDH)。

  • static DH 算法里有一方的私钥是静态的,通常是服务器方固定,即a不变。而另一方(也就是客户端)随机选择私钥,即b采用随机数。于是DH交换密钥时就只有客户端的公钥会变,而服务器公钥不变,在长期通信时就增加了被破解的风险,使得拥有海量计算资源的攻击者获得了足够的时间,最终能够暴力破解出服务器私钥,然后计算得到所有的共享秘密 Pre-Master,不具有“前向安全”。
  • DHE 算法的关键在于“E”表示的临时性上(ephemeral),每次交换密钥时双方的私钥都是随机选择、临时生成的,用完就扔掉,下次通信不会再使用,相当于“一次一密”。所以,即使攻击者破解了某一次的私钥,其他通信过程的私钥仍然是安全的,不会被解密,实现了“前向安全”。
ECDH

利用椭圆曲线上的离散对数问题,进行DH密钥交换。就是把 DH 算法里整数域的离散对数,替换成了椭圆曲线上的离散对数。

ECDHE:
“短暂 - 椭圆曲线 - 迪菲 - 赫尔曼”算法(ephemeral Elliptic CurveDiffie–Hellman),里面的关键字是“短暂”“椭圆曲线”和“迪菲 - 赫尔曼”

就是把 DHE 算法里整数域的离散对数,替换成了椭圆曲线上的离散对数。原来 DHE 算法里的是任意整数,而 ECDHE 则是把连续的椭圆曲线给“离散化”成整数,用椭圆曲线上的“倍运算”替换了 DHE 里的幂运算。

ECDHE 算法的公开参数是椭圆曲线 C、基点 G 和模数 P,私钥是倍数 x,公钥是倍点 xG,已知倍点 xG 要想计算出离散对数 x 是非常困难的。在通信时 Alice 和 Bob 各自随机选择两个数字 a 和 b 作为私钥,计算 A=aG、B=bG 作为公钥,然后互相交换,用与 DHE 相同的算法,计算得到 aB=abG=Ab,就是共享秘密 Pre-Master。因为椭圆曲线离散对数的计算难度比普通的离散对数更大,所以 ECDHE 的安全性比 DHE 还要高,更能够抵御黑客的攻击。

为什么DH算法只能用于密钥交换,不能用于数字签名?

DH算法只能用于密钥的交换,没有原文、摘要这些参数,无法生成数字签名。

使用国密算法如何在标准TLS协议中使用?

1.IETF
国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)为一个公开性质的大型民间国际团体,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员。其主要任务是负责互联网相关技术规范的研发和制定,为整个互联⽹贡献了⼤量的关键技术标准,比如:IPv4、IPv6、TCP/IP、SSL/TLS、 QUIC等。

RFC,Request For Comments,文件收集了有关互联网相关信息,以及UNIX和互联网社群的软件文件,以编号排定。RFC由互联网工程任务组(IETF)发布。

2.RFC 8998
首个IETF国密标准正式发布,加速国密算法应用进程
2021-03-16 17:18
《商密算法在TLS 1.3中的应用》标准(RFC 8998)在IETF发布,将国密算法应用到TLS(传输层安全协议) 1.3中。这也是我国首次正式将国密算法推进到IETF国际标准中,使得我国的国密算法第⼀次在TLS协议中被认可使⽤⽽⽆需担⼼互操作性和冲突问题。本标准的发布也将大力促进我国商用密码算法在行业内的应用。
TLS(Transport Layer Security,传输层安全协议)用于在两个通信应用程序之间提供保密性和数据完整性,是互联网上实现保密通信的最权威、应用最广泛的技术标准。国密,是国家商用密码的简称,由国家密码管理局制定算法标准,同时也制定了大量的产品及接口规范以及应用场景。
本次发布的RFC 8998标准中定义了两个TLS 1.3中的国密加密套件,⼀个SM2椭圆曲线ID,以及⼀个SM2-SM3的签名⽅法。本标准由蚂蚁集团牵头起草,标准推进讨论中,也得到了阿里云、北京大学、360、天威诚信、江南天安、云钥网络、上海CA等机构的认可和支持。该标准的发布有效解决了国密算法在TLS 1.3协议中应用的互联互通问题,将大力促进国密算法的应用。

蚂蚁集团在国密算法研究和应用方面有着深厚的技术实践积累。蚂蚁密码卡是目前国内首张国密三级云服务密码卡,更适用于云原生时代, 拥有完备的安全密钥管理体系, 完备的安全检测和保护机制, 具备拆机密钥自毁、防物理拆机、防侧信道攻击等能力, 拥有国际国内一流的国密加解密能力, 支持虚拟化云原生业务, 是蚂蚁集团屡创双十一全球支付能力新高的关键基础设施。

蚂蚁密码卡目前已经在蚂蚁集团主站得到广泛的应用,承载密码平台95%以上国产密码算法的运算。蚂蚁科技对外输出中,例如在OceanBase一体机和蚂蚁链一体机等软硬件一体化解决方案中,蚂蚁卡也作为安全底盘的标配,赋能应用高安全性、合规、高效的密钥管理、密码算力、应用数据保护。

3.GMSSL
参考文章地址:https://wonderful.blog.csdn.net/article/details/78015580
1.GM/T 没有单独规范 SSL协议的文件,而是在SSL VPN技术规范中定义了国密SSL协议。规范号:GM/T 0024-2014

2.简单总结下国密SSL协议和标准的TLS协议之间的区别
(1)协议号
TLS协议号为0x0301 0x0302 0x0303,分别表示TLS1.0 1.1 1.2
而国密SSL版本号为0x0101,其参考了TLS1.1。
(2)加密算法
国密SSL定义了多个加密套件,较主流的是如下2个:
ECC_SM4_SM3 和 ECDHE_SM4_SM3
注意 :
1)ECDHE_SM4_SM3 必须要求双向认证。
2)ECC和ECDHE实现的算法为SM2
3)套件ECC 对应的是标准的RSA,切勿被ECC迷惑,这个ECC并不和标准的椭圆曲线密钥交换算法类似,而是和RSA类似。服务器发送ECC公钥(在证书中)到客户端,客户端拿ECC公钥加密随机数给服务器(client key exchange)。

(3)certificate报文
国密规范定义发送证书时需要发送两个证书,签名证书和加密证书(双证书体系)。与标准TLS报文格式一样,只是第一个证书是签名证书,第二个证书是加密证书。

密码学ECC算法梳理总结相关推荐

  1. 数字签名验签 — ECC算法

    前言 ​ 前段时间,项目上有需求对于重要文件的传输接收时,接收端需要对文件进行安全校验,采用数字签名的方式确保数据来源的安全性以及数据完整性.之前未接触过密码安全方面的知识,现将实施过程中所遇所学记录 ...

  2. 基于ECC算法的秘钥协商

    基于ECC算法的衍生算法 ECDH(ECC+DH) RSA ECDHE(ECC+DHE) ECDH密钥协商(ECC+DH) 椭圆曲线密码学是属于非对称密码学的,其私钥的计算公式如下: 私钥是一个随机数 ...

  3. 奇妙的安全旅行之ECC算法

    hi,大家好,我是开发者FTD.今天我们来介绍一下非对称加密算法的ECC算法. ECC 算法简介 ECC 是 Elliptic Curves Cryptography 的缩写,意为椭圆曲线密码编码学. ...

  4. 椭圆曲线密码学(ECC)简介

    这一节要聊的是 ECC ( Elliptic Curve Cryptography ),也就是椭圆曲线密码学.跟 RSA 一样,ECC 也属于公开密钥加密,ECC 算法也是用来生成公钥的私钥的.本节我 ...

  5. java使用ECC算法进行加解密加验签

    文章目录 前言 一.ECC是什么? 二.使用步骤 1.引入依赖 2.代码实现 总结 前言 最近做的签名应用需要用到ECC算法,需要使用ECC密钥进行加解密和加验签功能,这里就用JDK提供的包和BC进行 ...

  6. ecc椭圆加密算法c语言,ECC算法介绍 - 椭圆曲线加密算法 - 中国数字证书CHINASSL

    ECC(Elliptic Curves Cryptography)加密算法是一种公钥加密算法,与主流的RSA算法相比,ECC算法可以使用较短的密钥达到相同的安全程度.近年来,人们对ECC的认识已经不再 ...

  7. ECC算法原理的认识

    公开密钥算法总是要基于一个数学上的难题.比如RSA 依据的是:给定两个素数p.q 很容易相乘得到n,而对n进行因式分解却相对困难.RSA 算法原理具体如下: 找出两个"很大"的质数 ...

  8. ECC算法C语言实现

    密码学实验:ECC算法实现 1.实验内容 2.运行结果: 1.椭圆曲线上的点集 2.椭圆曲线生成元以及对应的阶 3.加解密算法 代码如下: /*(1)编程计算该椭圆曲线上所有在有限域GF(89)上的点 ...

  9. php使用ecc算法进行签名,密码之ECC算法原理的认识

    转:https://blog.csdn.net/sszgg2006/article/details/41945163 公开密钥算法总是要基于一个数学上的难题.比如RSA 依据的是:给定两个素数p.q ...

最新文章

  1. C语言hk,C语言再学习
  2. caffe显示特征图
  3. JZOJ 5630. 【NOI2018模拟4.4】Connection
  4. C语言的main函数到底怎么写的
  5. NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)
  6. 【转载】jvm内存回收
  7. 【报告分享】2020中国电商直播粉丝价值研究报告.pdf(附下载链接)
  8. BP神经网络的数学原理及其算法实现
  9. 十四、K8s calico网络的通信及网络策略
  10. python不同版本切换_Python版本切换,python,的
  11. gmt绘制江苏省高程异常图
  12. 极速office(Excel)怎么把边框线条加粗
  13. Wox自制主题 - Material
  14. justinmind破解方法
  15. python码合并txt文件
  16. 常见3种视频加密原理知多少
  17. android 键盘快捷指令
  18. 《Java I/O》Chapter 1
  19. 产品Backlog 管理
  20. 1079.活字印刷(Python)

热门文章

  1. 简单实用的Chrom浏览器模拟POST请求方式
  2. 安全无边界,广和通携5G模组+AI智慧安防解决方案闪耀CPSE安博会
  3. 注意力机制(Attention Mechanism)-SENet
  4. Rust:如何实现一个线程池?
  5. Eclipse详解(一)
  6. @mysql读写分离分库分表
  7. 数据结构:头指针,头结点详解(新手.小白)
  8. 【Matlab】论文各种图例配色Matlab绘制
  9. 电流采样INA282/INA286原理图设计
  10. asp.net+sqlserver助学贷款管理系统