技术标签: 算法 加密算法 签名认证 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公钥私钥对生成,公钥加密/私钥解密
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读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模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读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回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读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发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读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.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象