openssl学习(二) 椭圆曲线

AlgoPioneer
• 阅读 3369
openssl学习(二)    椭圆曲线

  椭圆曲线(ECC)算法是一种公钥算法,功能同RSA一样,但是,相比与RSA,ECC处理速度更快,占用空间也小,毕竟它长度比RSA小得多.
  openssl实现的ECC算法系列包括三部分,ECC 算法(crypto/ec)、椭圆曲线数字签名算法 ECDSA (crypto/ecdsa)以及椭圆曲线密钥交换算法 ECDH(crypto/dh)。
  这里主要以签名为例.

#include <stdio.h>
#include <string.h>
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/objects.h>
#include <openssl/err.h>
#include <openssl/sha.h>

int main(void)
{
        int rc = 0;
        int nid = 0;
        EC_KEY *key = NULL;
        EC_GROUP *group = NULL;
        EC_builtin_curve *curves = NULL;
        int crv_len = 0;
        int key_size = 0;
        unsigned char hash_data[20] = {0};
        unsigned char sign[256] = {0};
        unsigned int sign_len = 0;     
        unsigned char message[] = "abcdefghijklmnopqrstuvwxyz1234567890";
        
        /* 构造EC_KEY数据结构 */
        key = EC_KEY_new();
        if (key == NULL) {
                printf("EC_KEY_new err.\n");
                return 0;
        }
        
        /* 获取实现的椭圆曲线个数 */
        crv_len = EC_get_builtin_curves(NULL, 0);
        curves = (EC_builtin_curve *)calloc(sizeof(EC_builtin_curve) * crv_len, 1);
        EC_get_builtin_curves(curves, crv_len);
#if 0
        for (int i = 0; i < crv_len; i++) {
                printf("***** %d *****\n", i);
                printf("nid = %d\n", curves[i].nid);
                printf("comment = %s\n", curves[i].comment);
        }
#endif   
        /* 选择一种椭圆曲线 */
        nid = OBJ_sn2nid("SM2");
        
        /* 根据选择的椭圆曲线生成密钥参数 group */
        group = EC_GROUP_new_by_curve_name(nid);
        if (group == NULL) {
                printf("EC_GROUP_new_by_curve_name err!\n");
                return -1;
        }
        
        /* 设置密钥参数 */
        rc = EC_KEY_set_group(key, group);
        if (rc != 1) {
                printf("EC_KEY_set_group err.\n");
                return -1;
        }
        
        /* 生成密钥 */
        rc = EC_KEY_generate_key(key);
        if (rc != 1) {
                printf("EC_KEY_generate_key err.\n");
                return 0;
        }
        
        /* 检查密钥 */
        rc = EC_KEY_check_key(key);
        if (rc != 1) {
                printf("check key err.\n");
                return 0;
        }
        
        key_size = ECDSA_size(key);
        printf("key_size = %d\n", key_size);

        SHA1(message, strlen((char *)message), hash_data);              
        
        // sign. 第一个参数0,该参数忽略.
        rc = ECDSA_sign(0, hash_data, 20, sign, &sign_len, key);
        if (rc != 1) {
                printf("ECDSA_sign err.\n");
                return 0;
        }
        printf("sign success.\n");
        
        // verify, 第一个参数同sign
        rc = ECDSA_verify(0, hash_data, 20, sign, sign_len, key);
        if (rc != 1) {
                printf("ECDSA_verify err.\n");
                return 0;
        }
        printf("verify success.\n");
        
        EC_GROUP_free(group), group = NULL;
        EC_KEY_free(key), key = NULL;
        free(curves), curves = NULL;
        
        return 0;
}

  这个代码例子主要是用最基础的一些结构体,在实际使用过程中,会涉及到密钥的转换,密钥结构体构建等,将在后续的EVP以及编解码等学习中慢慢练习.
  openssl很庞大,某一个功能,可以使用多种方法来实现.学习头文件,是一个比较不错的办法.

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
RSA —— 典型非对称加密算法
RSA——JAVA代码(toc_0)RSA——加密过程图解(toc_1)(图1)构建RSA算法密匙对(toc_2)(图2)甲方向乙方发送RSA加密数据(toc_3)(图3)乙方向甲方发送RSA加密数据(toc_4)RSA——简述(
Stella981 Stella981
3年前
ECDSA密钥对生成以及在Token中的应用
1概述本文主要讲述了如何利用Openssl生成ECDSA密钥对,并利用Auth0库进行Token生成及验证的过程。2ECDSA2.1简介ECC(EllipticCurveCryptography,椭圆曲线加密)是一种基于椭圆曲线数学的公钥加密算法,而ECDSA
Stella981 Stella981
3年前
Git使用总结
生成密钥1.打开GitBash,运行  \_sshkeygen  \_2.密钥生成空间\_~/.ssh/id\_rsa  \_(C:/User/.ssh)3.输入密码(不输入增直接回车跳过)4._~/.ssh/id\_rsa.pub_ (公钥), _id\_rsa_ (私钥)下载代码到本地
Stella981 Stella981
3年前
OpenSSL中关于RSA_new和RSA_free的内存泄漏
在使用OpenSSL的RSA加解密的时候,发现RSA\_new()初始化和RSA\_free()释放RSA结构体后依然会有内存泄漏。网上Baidu、Google之,发现这个相关信息很少(至少中文搜索结果是这样,不知是研究这个的人太少还是这个太基础了。。。),最后终于在某个E文论坛上找到了解决办法。在这里总结了一下,供大家参考。我的OpenSSL版本是0.9.
Stella981 Stella981
3年前
OpenSSL和Python实现RSA Key公钥加密私钥解密
基于非对称算法的RSAKey主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密)。本文提供一个基于OpenSSL和Python进行非对称加解密的例子。1\.OpenSSL实现非对称加解密1.1生成私钥,并导出公钥生成2048bit的PEM格式的RSAKey:Key.pem$openssl
Stella981 Stella981
3年前
Openssl生成RSA公私钥以及将公钥转换成C#支持的格式
Openssl生成RSA公私钥以及将公钥转换成C支持的格式1.RSA算法介绍RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e、d。其中,n是两个大质数p、q的积,n被称为模数,n的二进
Wesley13 Wesley13
3年前
JAVA_RSA_的加解密
RSA为非对称加密算法。数字签名的过程:1、对明文数据进行HASH加密,不可逆;2、对加密后的数据再用RSA的私钥进行二次加密。数字签名的验证过程:1、对明文数据进行HASH加密,不可逆;2、用RSA的公钥对数字签名后的数据进行解密;3、把1的结果和2的结果进行比较是否相等。RSA加密的过程和解密的过程都需要三步:加/解密、分组、填充。这三部分每
Stella981 Stella981
3年前
SVG 绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Easter79 Easter79
3年前
SVG 绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Easter79 Easter79
3年前
SVG 如何绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。
Stella981 Stella981
3年前
SVG 如何绘制椭圆
本节我们来学习如何在SVG中绘制椭圆,椭圆和圆形有点像,但是又不一样。圆形只有一个半径,而椭圆x轴和y轴上的半径不同,所以椭圆就是一个不规则的圆。如何绘制一个椭圆在绘制椭圆时,可以通过cx和cy属性确定椭圆的圆心,rx设置椭圆的x轴的半径,ry设置y轴的半径。