什么是ECC?ECC 和 RSA 之间有何区别?_ecc和rsa-程序员宅基地

技术标签: 算法  加密算法  签名认证  ECC  # 安全基础  加密  

椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。

它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。

继续阅读,进一步了解椭圆曲线密码学,以及为何它被认为是最安全的加密形式。

ECC 和 RSA 之间有何区别?

在讨论 ECC 和 RSA 之间的区别之前,了解公钥加密算法的工作原理非常重要。

最基础的强加密算法是“活板门函数”。 虽然掉进一扇活板门非常容易,但重新回到外面却很难,因为活板门只朝一个方向摆动。

因此,要使加密算法有效且安全,用来加密信息的方法必须很简单,但几乎不可能在没有解密密钥的情况下解密。

ECC 和 RSA 都是利用高等数学函数实现的公钥加密算法。

公钥加密包括两个组成部分,公钥和私钥。

公钥对消息进行加密的方法是,通过数学算法将消息转换为一个极大的随机数字。

消息只能用私钥解密,私钥获取这一随机大数后,对其应用另一种不同的算法,相当于“撤销”了该原始消息。

ECC 和 RSA 背后的数学问题非常复杂,只能通过计算机解决。 RSA 算法背后的数学问题超出了本篇博文的涵盖范围,但重点在于 RSA 的安全性就建立在分解两个大素数乘积的的巨大难度之上。

让我们来复习一下,对 20 这样的数字进行因数分解的方法如下:

20 = 4 * 5 = 2 * 2 * 5 = 2^2 * 5

看起来很简单,对吧?

那么,现在来想象一下如何对一个长度超过 100 位的数字进行因数分解。

这就是为什么即使拥有公钥,要在素因数未知的情况下计算出私钥,所需的计算密集程度也是非常高的。

RSA 加密算法的问题

虽然 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 和其他公钥加密算法。

使用椭圆曲线加密算法有以下两个优势。

  • ECC 生成密钥、加密和解密所需的计算资源和带宽都较低。
  • 由于 ECC 的密钥大小较小,与 RSA 相比,ECC 的密钥生成、加密和解密等操作可以执行得更快,这意味着最终用户的延迟更小。
  • 这些优势使 ECC 在资源有限的环境中尤其实用,例如手机和物联网 (IoT) 设备。

椭圆曲线加密算法的安全性如何?

虽然 RSA 加密算法具有极高的安全性,但 ECC 可以说是更胜一筹。

理论上,量子计算机或可有效解决 RSA 所依赖的因数分解问题,从而破解 RSA。 这种情况是否会很快成真,是一个很有争议的问题。 但我们可以肯定地说,考虑到 ECC 的复杂性,与 RSA 相比,它更能抵抗量子计算攻击。

有多大的抵抗能力?

荷兰数学家 Arjen Lenstra 在与他人合著的一篇研究论文中,将破解加密算法与烧水进行比较。

基本概念是计算出破解一个特定的加密算法需要多少能量,然后计算这些能量可以煮沸多少水。

通过这样的类比,破解一个 228 位 RSA 密钥所需的能量比煮沸一茶匙水所需的能量还少,但破解一个 228 位 ECC 密钥所消耗的能量可以煮沸地球上所有的水。

要达到相同的安全级别,RSA 密钥的长度需要达到 2380 位。

椭圆曲线加密算法的用武之地

如前所述,ECC 的密钥较小,因而尤其适合 CPU 和内存资源较低的设备,如移动设备和物联网设备。

这有助于 Web 和移动应用程序开发人员构建高性能、低延迟的网站和应用程序,同时为用户提供强大的数据安全性。 ECC 常常被用于保护蓝牙、Wi-Fi 和近场通信 (NFC) 等无线移动通信协议。

以下是一些更常见的 ECC 使用案例:

  • 安全通信协议:ECC 被用于各种安全通信协议,以提供加密、数字签名和密钥交换。 例如,用于安全网页浏览的传输层安全性 (TLS),用于安全远程登录的安全外壳 (SSH),以及用于安全网络通信的虚拟专用网络 (VPN)。
  • 加密货币和区块链技术:比特币、以太币和莱特币等许多加密货币都利用椭圆曲线加密来生成公钥和私钥对,以及签署交易。 ECC 能够提供保护数字资产和确保区块链网络完整性所需的加密安全性。
  • 智能卡和嵌入式系统:ECC 通常被用于保护支付系统、门禁系统、电子护照和其他需要既安全又小巧的加密解决方案的应用。
  • 数字签名和证书:ECC 可以用于生成数字签名,用于验证数字文档和消息的真实性和完整性。 基于 ECC 的数字签名还被部署在公钥基础设施 (PKI) 系统中,用于发放和验证数字证书。
  • 虽然与 RSA 相比,ECC 的历史还很短,但已充分标准化,并得到来自私营部门组织和行业机构的广泛支持。 例如,美国国家标准与技术研究院 (NIST) 在其加密算法套件中对 ECC 进行了标准化。 此外,流行的加密库、编程语言和操作系统也为 ECC 提供支持。 这一接受度进一步促进了金融、医疗和政府服务等众多部门对其的采用。

考虑到这些因素,我们可以肯定地说,椭圆曲线加密算法广受欢迎,并在众多应用和行业中得到了普遍的采用。 它的效率、安全性和广泛的支持使其成为安全通信和加密操作的可靠选择。

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 最大的优势。

私钥的参数:

  • priv: 私钥,一个 256bits 的大整数,对应我们前面介绍的 k 倍运算 k 倍运算 k倍运算中的 $k
  • pub: 公钥,是一个椭圆曲线(EC)上的坐标 x , y {x, y} x,y,也就是我们 well-known 的基点 $G
  • ASN1 OID: prime256v1, 椭圆曲线的名称
  • NIST CURVE: P-256

使用安全随机数生成器即可直接生成出 ECC 的私钥 priv,因此 ECC 的密钥对生成速度非常快。

八、椭圆曲线加解密算法原理

设私钥、公钥分别为d、Q,即Q = dG,其中G为基点,椭圆曲线上的已知G和dG,求d是非常困难的,也就是说已知公钥和基点,想要算出私钥是非常困难的。

  • 公钥加密:选择随机数r,将消息M生成密文C,该密文是一个点对,C = {rG, M+rQ},其中Q为公钥。
  • 私钥解密:M + rQ - d(rG) = M + r(dG) - d(rG) = M,其中d、Q分别为私钥、公钥。

九、椭圆曲线签名算法原理

椭圆曲线签名算法(ECDSA)。设私钥、公钥分别为d、Q,即Q = dG,其中G为基点。

私钥签名:

  • 选择随机数r,计算点rG(x, y)。
  • 根据随机数r、消息M的哈希h、私钥d,计算s = (h + dx)/r。
  • 将消息M、和签名{rG, s}发给接收方。

公钥验证签名:

  • 接收方收到消息M、以及签名{rG=(x,y), s}。
  • 根据消息求哈希h。
  • 使用发送方公钥Q计算:hG/s + xQ/s,并与rG比较,如相等即验签成功。

原理:hG/s + xQ/s = hG/s + x(dG)/s = (h+xd)G/s = r(h+xd)G / (h+dx) = rG

10、签名过程

假设要签名的消息是一个字符串:“Hello World!”。DSA签名的第一个步骤是对待签名的消息生成一个消息摘要,不同的签名算法使用不同的消息摘要算法,而ECDSA256使用SHA256生成256比特的摘要。

摘要生成结束后,应用签名算法对摘要进行签名:

  • 产生一个随机数k
  • 利用随机数k,计算出两个大数r和s。将r和s拼在一起就构成了对消息摘要的签名。
    这里需要注意的是,因为随机数k的存在,对于同一条消息,使用同一个算法,产生的签名是不一样的。从函数的角度来理解,签名函数对同样的输入会产生不同的输出。因为函数内部会将随机值混入签名的过程。

11、验证过程

关于验证过程,这里不讨论它的算法细节。从宏观上看,消息的接收方从签名中分离出r和s,然后利用公开的密钥信息和s计算出r。如果计算出的r和接收到的r值相同,则表示验证成功,否则,表示验证失败。

12、工具

推荐一个在线ECC加密解密且可生成公钥私钥对的工具:在线ECC公钥私钥对生成,公钥加密/私钥解密

13 、参考资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45264425/article/details/137337498

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签