存档

文章标签 ‘椭圆曲线’

使用 openssl 进行椭圆曲线加解密(SM2)

2019/01/20 12,510

在之前一篇博客 ECC(Elliptic Curves Cryptography) 椭圆曲线加密原理 简单地阐述了 ECC 加解密的原理。这本篇博客中接着来聊一聊如何使用 OPENSSL 来进行 ECC 加解密。

首先需要明确一点的是:ECC 本身并没有定义一套加解密的方法,它主要作用于密钥交换(ECDHE),与签名认证(ECDSA). 不过后来中国工程师设计定义了一套加密方法,并于近年得到了世界的认可,这就是中国商用(国家标准) SM2 椭圆曲线公钥密码算法

一. 基本概念

其实在 openssl 中,椭圆曲线分两种形式,一种是之前讲到的质数域上的椭圆曲线 ,将其称为 $F_p$ 其方程为:

$$y^2 \ \mod \ p = x^3 + ax + b \ \mod \ p$$

另一种是二进制域,称为 $F_{2^m}$, 其方程为:

$$y^2  + xy = x^3 + ax^2 + b ,\  (b != 0)$$

在这里只讨论 $F_p$ 相关的内容。

椭圆曲线上的点

椭圆曲线上的点使用 EC_POINT 来表示, 它定义在 ec_locl.h :

继续阅读

ECC(Elliptic Curves Cryptography) 椭圆曲线加密原理

2018/09/07 8,596

ECC(Elliptic Curves Cryptography) 属于非对称加密算法的一个重要组成部分。
本文尽量简单地阐述椭圆曲线加密的原理,但需要读者有一些初级的数论与离散数学相关的知识,或者推荐简单地阅读《算法导论》第31章:数论算法。

椭圆曲线

首先需要明确的是,我们讨论的是什么样的曲线。
椭圆曲线有比较复杂的定义: https://en.wikipedia.org/wiki/Elliptic_curve .而我们讨论的椭圆曲线比这个简单,它是以下方程所描述的一条平滑曲线 :

$$y^2 = x^3 + ax + b, 4a^3 + 27b^2 \neq 0$$

它描述的并不是一个椭圆,之所以称它为"椭圆曲线方程", 是因为它源自于求椭圆弧长的椭圆积分的反函数。椭圆曲线是无奇点的,即没有尖点,且不会自相交。当 $a,b$ 的值不同时,椭圆曲线会表现出不同的形态:

而当 $4a^3 + 27b^2 = 0$ 时, 它不是椭圆曲线:

从图中可以看到,椭圆曲线总是 沿 x 轴对称 的。这是因为 $y^2$ 的存在。特殊地,我们规定 无穷远点 也存在于椭圆曲线上。我们用 $0$ 或符号 $O$ 来表示无穷远点,则椭圆曲线在实数域上的定义如下:
$$\{ (x,y) \in \mathbb{R}^2 | y^2 = x^3 + ax + b, 4a^3 + 27b^2 \neq 0 \} \cup \{0\}$$

继续阅读