首页 > Note > 使用 openssl 进行椭圆曲线加解密(SM2)

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

2019年1月20日 发表评论 阅读评论

在之前一篇博客 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 :

EC_POINT 的操作定义在 ec.h 中,有以下操作:

椭圆曲线参数

由曲线方程可知,要确定一条曲线,需要知道三个参数 a, b, p。在 openssl 中用结构体 EC_GROUP 来表示。其结构定义在 ec_locl.h 中:

  • generator 基点 G
  • field 质数 p
  • a, b 常量参数

一般来说,除非有特殊的需求会让你自定义一条曲线,否则直接使用 OPENSSL 内置的曲线,这些曲线是经过密码学专家或组织精心设计的:

openssl 内置的曲线非常之多,可以使用 EC_get_builtin_curves来获取:

这些曲线被定义在 ec_curve.c 中,如 NID_sm2 (也叫做 NID_sm2p256v1) 的定义如下:

二. 加解密

由 ECC 原理我们知道,椭圆曲线利用的是 在有限域上的椭圆曲线,已知曲线上的一个点 xG, 无法有效地求得 x 这样一个离散对数问题。 xG 可以做为公钥, x 做为私钥。

生成密钥对

API EC_KEY_generate_key(EC_KEY) 用于生成密钥对。 EC_KEY 的结构如下:

包含一条曲线和一对密钥。当只有 pub_key 时,EC_KEY 做为公钥,当只有 priv_key 时,EC_KEY 做为私钥。

生成一对密钥的示例代码如下:

SM2 加解密

SM2 的 API 定义在 sm2.h 中。加解密用到的有:

加密用到的是公钥, 解密用到的是私钥。

 

 

 

 

  1. 匿名
    2023年4月10日20:35 | #1

    EC_KEY_set_group返回值为0是什么原因

  2. 444451
    2021年7月30日11:51 | #2

    请问GenECCKeys方法在哪里

  3. 夜渡寒鸦
    2019年10月9日10:30 | #3

    在源码中是包含sm2目录的,但是在编译后就没有出现sm2头文件。我是用vs2019 利用指令 perl no-asm win
    64A 编译的64位库,不过好像sm2那个文件没有编译?

  4. RyanWong
    2019年10月8日18:29 | #4

    @夜渡寒鸦
    我看了下最新的源码,sm2.h 已经位于 https://github.com/openssl/openssl/blob/master/include/crypto/sm2.h

  5. 夜渡寒鸦
    2019年10月4日19:49 | #5

    您好,请问在编译openssl 1.1.1d后,没有出现sm2.h、sm3.h,是编译有什么问题吗?博主方便交流一下吗?

  6. 匿名
    2019年7月31日16:58 | #6

    请问

  7. 2019年7月31日16:53 | #7

    请问我在编译的时候出现 openssl/sm2.h:没有那个文件或目录 ,这是因为Openssl版本的原因吗?

    • RyanWong
      2019年8月1日09:58 | #8

      文件位于 https://github.com/openssl/openssl/blob/master/crypto/include/internal/sm2.h 编译完成后,在openssl/include 目录下应该有该头文件

  8. 阡so
    2019年7月31日16:26 | #9

    你好,请问编译时出现 openssl/sm2.h:没有那个文件或目录 是因为Openssl版本的问题吗?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.