当前位置: 首页 > news >正文

密码学基础---椭圆曲线一文打尽

1.ECC简介及密钥生成

当前公认安全有效的三大类公钥密钥体制分别为基于大数因子分解难题(RSA)、离散对数难题(DSA)和椭圆曲线离散对数(ECC)难题的密码体制。

最初RSA由于其容易理解被广泛运用,但随着计算机性能的提升,要保证RSA的安全性,则必须要增加密钥长度,所以我们可以看到RSA密钥从1024bits慢慢来到了4096bits。

由于汽车网络安全近几年才兴起,专为密钥存储设计的硬件资源有限,如果用RSA算法,密钥存储数量有限,而ECC(Elliptic Curve Cryptography)的出现有效弥补了这方面的缺憾,实现了密钥效率上的突破,根据NIST.SP.800-57pt1r5描述,对称算法和非对称算法的安全强度如下图所示:

图  安全性对比

可以看到,160bits的ECC密钥长度实现的安全强度等同于RSA 密钥长度1024bits,所以汽车行业越来越倾向使用ECC来实现验签、会话密钥协商等。

椭圆曲线离散对数问题如下定义:已知椭圆曲线E和点G,随机选择一个整数d,容易计算Q = d*G,但给定Q和G计算d就很困难。

基于上述定义,密钥生成的方法如下:

  1. 确定拥有素数阶n的点G(xG,yG),建议使用标准中推荐的椭圆曲线;
  2. 在[1, n-1]中随机选择整数d作为私钥;
  3. 计算Q = d * G,得到公钥;
  4. 因此公钥为点G(x,y),私钥为d;离散对数难解性保证了已知公钥Q的情况不能计算出私钥d。

2.椭圆曲线汇总

椭圆曲线是一个具有两个变量x、y的三次方程,满足公式:

的所有点(x,y)的集合,以及一个无穷远点O(y趋于无穷)。该公式也叫魏尔斯特拉斯方程(Weierstrass function),所有的曲线均属于该方程的变体。

例如,

针对素数有限域GF(P)的椭圆曲线是针对固定a、b,满足方程为:

的所有点(x,y)的集合,外加无穷远点O。

        其中,a、b、x和y均在有限域GF(p)({0,1,...,p-1})上取值,满足4a^2+27b^3≠0,;p是大于3的素数,因此用Ep(a,b)表示。

        针对阶为2m的有限域GF(2m)上的椭圆曲线是针对固定a、b,满足方程:

的所有点(x,y)的结合,再加上无穷远点O,

        其中,a、b、x和y均能在有限域GF(2m)上取值,该域上的元素是m位的二进制串。

        很明显,基于素域GF(p)对于软件计算比较友好,而基于二元扩域的GF(2^m)明显是硬件更有效率。

        密钥生成时提到标准中推荐的曲线,主要从如下标准进行整理:

  1. SEC 2:Recommended Elliptic Curve Domain Parameters
  2. NIST SP800-186:Recommendations for Discrete Logarithm-based Cryptography
  3. Brainpool:Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation
  4. SM2椭圆曲线公钥密码算法

2.1 SEC 2

SEC 2由1998年成立的行业联盟SECG发布,该联盟全称The Standards for Efficient Cryptography Group,旨在指定商业标准,促进在密码学的高效和易操作性。

该联盟主要输出的标准叫做SEC(Standards for Efficient Cryptography),包括如下内容:

  1. SEC 1: Elliptic Curve Cryptography, Version 2.0
  2. SEC 2: Recommended Elliptic Curve Domain Parameteres, Version 2.0
  3. SEC 4: Elliptic Curve Qu-Vanstone Implicit Certificates

其中,SEC 2列出了SEC 1以及其他ECC标准(如ANSI X9.62、ANSI X9.63、IEEE 1363、IEEE 1363a等)的中常见椭圆曲线参数,如下表2、表3所示。

曲线参数

Strength

Size

RSA/DSA

Koblitz\Random

secp192k1

96

192

1536

k

secp192r1

96

192

1536

r

secp224k1

112

224

2048

k

secp224r1

112

224

2048

r

secp256k1

128

256

3072

k

secp256r1

128

256

3072

r

secp384r1

192

384

7680

r

secp521r1

256

521

15360

r

表  基于素数域GF(p)的椭圆曲线

其中,每列参数解释如下:

  • 上述曲线命名方式如下:
  • Sec:Standards for Efficient Cryptography的简称;
  • P:表示参数在素数有限域GF(p);
  • 后续数字:表示p的比特长度,例如192表示p的长度为192bit;
  • K\R:表示参数是与Koblitz曲线(k)相关还是随机生成(r) 
  • Strength:表示密钥强度的大致位数,一般来讲近似为阶数的一半;
  • Size:密钥长度;
  • RSA\DSA:对应同等强度的RSA\DSA的密钥长度
  • Koblitz\Random:
    • Koblitz Curve来自数学家Neal Koblitz,它是一种特殊的曲线,参数是精心挑选设置,可以通过优化大幅提升计算效率;
    • Random:可验证的随机种子产生的参数
  • 末位数字:表示在当前曲线下的参数配置有几种,例如1就为1种推荐配置。

上述域参数用公式T = (p,a,b,G,n,h)进行表示,其中p为素数,a、b为椭圆曲线参数,G为拥有素数阶n的点G(xG,yG),n为阶N与点G的比,h= N/n。

如下为secp256k1和secp256r1的推荐参数设置:

secp256k1:

  • p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 2^256 -2^32-2^9 -2^8 -2^7 -2^6-2^4-1
  • a=0
  • b=7
  • G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
  • 非压缩G=04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
  • n=FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
  • h = 01

secp256r1:

  • p = FFFFFFFF 00000001 00000000 00000000 00000000 FFFFFFFF FFFFFFFF FFFFFFFF
  • = 2^224 (2^32-1)+2^192 +2^96 -1
  • a=FFFFFFFF 00000001 00000000 00000000 00000000 FFFFFFFF FFFFFFFF FFFFFFFC
  • b=5AC635D8 AA3A93E7 B3EBBD55 769886BC 651D06B0 CC53B0F6 3BCE3C3E 27D2604B
  • 随机数种子:S = C49D3608 86E70493 6A6678E1 139D26B7 819F7E90
  • G = 03 6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0 F4A13945 D898C296
  • 非压缩G=04 6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0 F4A13945 D898C296 4FE342E2 FE1A7F9B 8EE7EB4A 7C0F9E16 2BCE3357 6B315ECE CBB64068 37BF51F5
  • n=FFFFFFFF 00000000 FFFFFFFF FFFFFFFF BCE6FAAD A7179E84 F3B9CAC2 FC632551
  • h = 01

曲线参数

Strength

Size

RSA/DSA

Koblitz\Random

sect163k1

80

163

1024

k

sect163r1

80

163

1024

r

sect163r2

80

163

1024

r

sect233k1

112

233

2240

k

sect233r1

112

233

2240

r

sect239k1

115

239

2304

k

sect283k1

128

383

3456

k

sect283r1

128

283

3456

r

sect409k1

192

409

7680

k

sect409r1

192

409

7680

r

sect571k1

256

571

15360

k

sect571r1

256

571

15360

r

表  基于GF(2^m)的椭圆曲线

同样的,基于GF(2^m)的椭圆曲线参数命名除了在sec后的字母为t,其余均类似。

2.2 NIST SP800-186

NIST SP800-186同样也是收集了一大堆各个标准的推荐曲线,其中包括了FIPS 186-4推荐曲线、SEC 2 secp256k1、Brainpool曲线等等,推荐曲线的安全强度总结如下:

安全强度

推荐曲线

112

P-224、K-233、B-233

128

P-256, W-25519, Curve25519, Edwards25519, K-283, B-283

192

P-384, K-409, B-409

224

W-448, Curve448, Edwards448, E448

256

P-521, K-571, B-571

表  推荐曲线及安全强度

其中,

  • 基于prime fields GF(p)的曲线,称为P-xxx曲线;
  • 基于Binary fields GF(2m)的曲线,称为B-xxx曲线;
  • Koblitz曲线,称为K-xxx曲线;
  • 维尔斯特拉斯曲线,称为W-xxx曲线;
  • 蒙哥马利曲线(Montgomery Cureves),包括Curve448、Curve25519

各曲线使用范围如下:

图 特定曲线的使用推荐

特别的,上述部分曲线与SEC 2的曲线推荐参数完全一致,仅在命名上有所不同,如下表所示:

NIST

SEC 2

P-192

secp192r1

P-224

secp224r1

P-256

secp256r1

P-384

secp384r1

P-521

secp521r1

K-163

sect163k1

K-233

sect233k1

K-283

sect283k1

K-409

sect409k1

K-571

sect521k1

B-163

sect163r2

B-233

sect233r1

B-283

sect283r1

B-409

sect409r1

B-571

sect521r1

表 4 NIST和SEC 2曲线

工具中的曲线命名采用SEC 2命名方式,如下图:

图  推荐椭圆曲线

2.3 Brainpool

Brainpool是由德国的电子支付系统研究中心(ECRYPT II)和德国电信(Deutsche Telekom)联合开发的一系列椭圆曲线。它主要想解决NIST\SEC 2曲线以下几个方面的问题:

  1. 参数以可验证的伪随机数方式生成(特别是对B-xxx、P-xxx的随机数种子的生成方式),并满足安全要求(例如Dual_EC_DRBG后门事件);
  2. 指定的域参数不包括所指定的所有位长度对应于对称的常用密钥长度加密算法。特别没有512位曲线定义,只有一个521位长度的曲线;
  3. 抵御侧信道攻击等

Brainpool曲线域参数长度位数包括160、192、224、256、320、384、512,曲线分为 brainpoolP160r1\t1、 brainpoolP192r1\t1、 brainpoolP224r1\t1、 brainpoolP256r1\t1、 brainpoolP320r1\t1、 brainpoolP384r1\t1、 brainpoolP512r1\t1

其中t1表示twisted curve,用于抵御侧信道攻击。

本程序仅实现用于TLS V1.3上所需的ECC Brainpool曲线,包括brainpoolP256r1、brainpoolP384r1、brainpoolP512r1。

根据标准,brainpoolP256r1推荐参数如下:

图  brainpoolP256r1域参数

其中,

  • p为基域的素数;
  • A、B满足方程y^2 = x^3 + A*x + B mod p的系数;
  • G(x,y)为基点;
  • q为G群的素数阶;
  • h为阶p与G的余数,例如E(GF(p))/q。

2.4 SM2

SM2是国家密码局推出的自主可控的算法。示例曲线包括:

素域GF(P)上椭圆曲线:Fp-192、Fp-256,满足方程y^2 = x^3+ax+b,域参数如下:

二元扩域GF(2^m)曲线F2m -193、F2m -257,满足方程y^2+xy=x^3+ax^2+b。示例如下:

3.数字签名

数字签名可以直接提供消息来源的真实性、消息的完整性、消息的不可否认性。

常见方案为发送方使用Hash函数对消息进行摘要计算,然后使用私钥对摘要进行加密生成一个特定的签名值,然后将消息和签名一起发送给接收方;接收方首先对消息进行Hash计算得到摘要,然后使用发送方公钥对签名值进行解密,得到摘要值1,将摘要和摘要值进行比对,保证了消息的完整性、消息来源未被伪造,同时具备不可抵赖性,因为理论上只有发送方才有私钥进行签名。

可用于数字签名的算法和方案包括RSA、DSA、ECDSA、EdDSA。

  • RSA:有简称RSASSA(来源RFC3447),主要基于大数因子分解的难点,是最早的公钥密码体制之一;
  • DSA(Digital Signature Algorithm):仅用于对消息进行签名,其安全性基于计算离散对数的难度;
  • ECDSA(Elliptic Curve Digital Signature Algorithm):基于椭圆曲线的签名;
  • EdDSA:Edwards Curve Digital Signature Algorithm
    • Ed25519:使用EdDSA算法和Curve25519曲线来进行签名的
    • Ed448:使用EdDSA算法进行签名

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙开发入门day10-组件导航
  • Python办公自动化:使用openpyxl 创建与保存 Excel 工作簿
  • MATLAB 手动实现投影密度法分割建筑物立面 (73)
  • Chart.js:内容、优点及使用方法
  • 常见的排序算法汇总(详解篇)
  • 稚晖君发布5款全能人形机器人,开源创新,全能应用
  • 单体应用spring Task和分布式调度
  • CDN劫持总结
  • MK米客方德推出新一代工业级SD NAND——更长寿命、更高速度、更优功耗
  • 白骑士的C#教学实战项目篇 4.1 控制台应用程序
  • 凹凸纹理概念
  • 定长滑动窗口算法
  • 【SQL】科目种类
  • 10个创意提示:让你的内容焕然一新!
  • NVDLA专题11:具体模块介绍——CROSS Channel Data Processor
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Angular4 模板式表单用法以及验证
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaScript设计模式之工厂模式
  • Logstash 参考指南(目录)
  • Netty 4.1 源代码学习:线程模型
  • React-redux的原理以及使用
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Webpack 4 学习01(基础配置)
  • 盘点那些不知名却常用的 Git 操作
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 优化 Vue 项目编译文件大小
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #知识分享#笔记#学习方法
  • (27)4.8 习题课
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)fread与fwrite详解
  • (初研) Sentence-embedding fine-tune notebook
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (四)stm32之通信协议
  • (转)Linq学习笔记
  • (转)shell调试方法
  • (转)重识new
  • .chm格式文件如何阅读
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 常见的偏门问题
  • .NET 直连SAP HANA数据库
  • .net(C#)中String.Format如何使用
  • /etc/shadow字段详解
  • /etc/sudoer文件配置简析