技术标签: 算法 加密算法 签名认证 ECC # 安全基础 加密
椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。
它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式。 ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。
继续阅读,进一步了解椭圆曲线密码学,以及为何它被认为是最安全的加密形式。
在讨论 ECC 和 RSA 之间的区别之前,了解公钥加密算法的工作原理非常重要。
最基础的强加密算法是“活板门函数”。 虽然掉进一扇活板门非常容易,但重新回到外面却很难,因为活板门只朝一个方向摆动。
因此,要使加密算法有效且安全,用来加密信息的方法必须很简单,但几乎不可能在没有解密密钥的情况下解密。
ECC 和 RSA 都是利用高等数学函数实现的公钥加密算法。
公钥加密包括两个组成部分,公钥和私钥。
公钥对消息进行加密的方法是,通过数学算法将消息转换为一个极大的随机数字。
消息只能用私钥解密,私钥获取这一随机大数后,对其应用另一种不同的算法,相当于“撤销”了该原始消息。
ECC 和 RSA 背后的数学问题非常复杂,只能通过计算机解决。 RSA 算法背后的数学问题超出了本篇博文的涵盖范围,但重点在于 RSA 的安全性就建立在分解两个大素数乘积的的巨大难度之上。
让我们来复习一下,对 20 这样的数字进行因数分解的方法如下:
20 = 4 * 5 = 2 * 2 * 5 = 2^2 * 5
看起来很简单,对吧?
那么,现在来想象一下如何对一个长度超过 100 位的数字进行因数分解。
这就是为什么即使拥有公钥,要在素因数未知的情况下计算出私钥,所需的计算密集程度也是非常高的。
虽然 RSA 算法是非常强的加密方法,但并非没有问题。
对大数进行因数分解非常困难,但困难比过去小。
因数分解是微积分和其他高等数学的核心组成部分,因此数学家们已经花费了数个世纪的时间来寻找更简单的解法。
目前存在的有效的大数因数分解算法包括通用数域筛法 (General Number Field Sieve),它是目前最著名的用于分解长度在 110 位以上的大数的算法。
与此同时,算力也在在以惊人的速度增长。 英特尔的联合创始人戈登·摩尔曾于 1965 年预测,芯片上的晶体管数量每两年就会增加一倍。 这一假说被称作“摩尔定律”,自 20 世纪 70 年代以来始终有效,甚至超额完成。 计算能力每两年翻一番 – 算力的价格也在不断下降。
由于分解极大整数所需的计算资源越来越容易获得,对普通人(包括网络犯罪分子)来说都处于可负担范围内,为适应变化的速度,RSA 密钥必须不断变大。
正因为如此,RSA 的加密和解密速度都相当慢,这使得它不适合加密大量信息,特别是在移动设备上。
于是 RSA 通常用于密钥交换和数字签名,而其中的实际数据则使用对称加密算法和较短的会话密钥进行加密。
与之相反,**椭圆曲线加密能够以更短的密钥长度提供更出色的安全性,**因而从计算和带宽需求来看具有更高的效率。 在下一节中,我们将介绍 ECC 的工作原理。
ECC 基于另一个称为椭圆曲线的高等数学领域。 椭圆曲线是由方程 y2 = x3 + ax + b 描述的曲线,其中 a 和 b 为常量,且该曲线的定义域是有限域。 绘制出的图形如下:
椭圆曲线具有的一些特殊性质,使它们对于数学家和密码学家而言既有趣又实用。 首先,椭圆曲线具有水平对称性。 位于 x 轴(水平轴)两侧的部分一模一样,就如同镜像。
此外,任意不垂直于椭圆曲线的直线与曲线的交点总是不超过三个。 在下面的示例中,这些点被标记为 P、Q 和 R。
椭圆曲线加密算法的安全性基于求解椭圆曲线离散对数问题的难度。 在给定曲线上的点 P 和标量 k 的情况下,要确定一个能够令 Q = k*P 的点 Q 非常困难 – 比因数分解一个极大整数要困难得多。
这一特性意味着 ECC 可以在密钥大小远小于 RSA 的前提下,提供与 RSA 相当甚至更可靠的安全性。
ECC 能够以较短的密钥提供极高的安全性,这一点使其优于 RSA 和其他公钥加密算法。
使用椭圆曲线加密算法有以下两个优势。
虽然 RSA 加密算法具有极高的安全性,但 ECC 可以说是更胜一筹。
理论上,量子计算机或可有效解决 RSA 所依赖的因数分解问题,从而破解 RSA。 这种情况是否会很快成真,是一个很有争议的问题。 但我们可以肯定地说,考虑到 ECC 的复杂性,与 RSA 相比,它更能抵抗量子计算攻击。
有多大的抵抗能力?
荷兰数学家 Arjen Lenstra 在与他人合著的一篇研究论文中,将破解加密算法与烧水进行比较。
基本概念是计算出破解一个特定的加密算法需要多少能量,然后计算这些能量可以煮沸多少水。
通过这样的类比,破解一个 228 位 RSA 密钥所需的能量比煮沸一茶匙水所需的能量还少,但破解一个 228 位 ECC 密钥所消耗的能量可以煮沸地球上所有的水。
要达到相同的安全级别,RSA 密钥的长度需要达到 2380 位。
如前所述,ECC 的密钥较小,因而尤其适合 CPU 和内存资源较低的设备,如移动设备和物联网设备。
这有助于 Web 和移动应用程序开发人员构建高性能、低延迟的网站和应用程序,同时为用户提供强大的数据安全性。 ECC 常常被用于保护蓝牙、Wi-Fi 和近场通信 (NFC) 等无线移动通信协议。
以下是一些更常见的 ECC 使用案例:
考虑到这些因素,我们可以肯定地说,椭圆曲线加密算法广受欢迎,并在众多应用和行业中得到了普遍的采用。 它的效率、安全性和广泛的支持使其成为安全通信和加密操作的可靠选择。
首先,跟 RSA 一样,让我们先看下怎么使用 openssl 生成一个使用 prime256v1 曲线的 ECC 密钥 对:
# 列出 openssl 支持的所有曲线名称
openssl ecparam -list_curves
# 生成 ec 算法的私钥,使用 prime256v1 算法,密钥长度 256 位。(强度大于 2048 位的 RSA 密钥)
openssl ecparam -genkey -name prime256v1 -out ecc-private-key.pem
# 通过密钥生成公钥
openssl ec -in ecc-private-key.pem -pubout -out ecc-public-key.pem
# 查看私钥内容
❯ cat ecc-private-key.pem
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIGm3wT/m4gDaoJGKfAHDXV2BVtdyb/aPTITJR5B6KVEtoAoGCCqGSM49
AwEHoUQDQgAE5IEIorw0WU5+om/UgfyYSKosiGO6Hpe8hxkqL5GUVPyu4LJkfw/e
99zhNJatliZ1Az/yCKww5KrXC8bQ9wGQvw==
-----END EC PRIVATE KEY-----
# 查看私钥的详细参数
❯ openssl ec -noout -text -in ecc-private-key.pem
read EC key
Private-Key: (256 bit)
priv:
69:b7:c1:3f:e6:e2:00:da:a0:91:8a:7c:01:c3:5d:
5d:81:56:d7:72:6f:f6:8f:4c:84:c9:47:90:7a:29:
51:2d
pub:
04:e4:81:08:a2:bc:34:59:4e:7e:a2:6f:d4:81:fc:
98:48:aa:2c:88:63:ba:1e:97:bc:87:19:2a:2f:91:
94:54:fc:ae:e0:b2:64:7f:0ff7:dc:e1:34:96:
ad:96:26:75:03:3f:f2:08:ac:30:e4:aa:d7:0b:c6:
d0:f7:01:90:bf
ASN1 OID: prime256v1
NIST CURVE: P-256
# 查看公钥内容
❯ cat ecc-public-key.pem
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5IEIorw0WU5+om/UgfyYSKosiGO6
Hpe8hxkqL5GUVPyu4LJkfw/e99zhNJatliZ1Az/yCKww5KrXC8bQ9wGQvw==
-----END PUBLIC KEY-----
# 查看公钥的参数
❯ openssl ec -noout -text -pubin -in ecc-public-key.pem
read EC key
Private-Key: (256 bit)
pub:
04:e4:81:08:a2:bc:34:59:4e:7e:a2:6f:d4:81:fc:
98:48:aa:2c:88:63:ba:1e:97:bc:87:19:2a:2f:91:
94:54:fc:ae:e0:b2:64:7f:0ff7:dc:e1:34:96:
ad:96:26:75:03:3f:f2:08:ac:30:e4:aa:d7:0b:c6:
d0:f7:01:90:bf
ASN1 OID: prime256v1
NIST CURVE: P-256
可以看到 ECC 算法的公钥私钥都比 RSA 小了非常多,数据量小,却能带来同等的安全强度,这是 ECC
相比 RSA 最大的优势。
私钥的参数:
使用安全随机数生成器即可直接生成出 ECC 的私钥 priv,因此 ECC 的密钥对生成速度非常快。
设私钥、公钥分别为d、Q,即Q = dG,其中G为基点,椭圆曲线上的已知G和dG,求d是非常困难的,也就是说已知公钥和基点,想要算出私钥是非常困难的。
椭圆曲线签名算法(ECDSA)。设私钥、公钥分别为d、Q,即Q = dG,其中G为基点。
私钥签名:
公钥验证签名:
原理:hG/s + xQ/s = hG/s + x(dG)/s = (h+xd)G/s = r(h+xd)G / (h+dx) = rG
假设要签名的消息是一个字符串:“Hello World!”。DSA签名的第一个步骤是对待签名的消息生成一个消息摘要,不同的签名算法使用不同的消息摘要算法,而ECDSA256使用SHA256生成256比特的摘要。
摘要生成结束后,应用签名算法对摘要进行签名:
关于验证过程,这里不讨论它的算法细节。从宏观上看,消息的接收方从签名中分离出r和s,然后利用公开的密钥信息和s计算出r。如果计算出的r和接收到的r值相同,则表示验证成功,否则,表示验证失败。
推荐一个在线ECC加密解密且可生成公钥私钥对的工具:在线ECC公钥私钥对生成,公钥加密/私钥解密
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法