您的位置:首页 > 其它

STM32加密库—ECC,ECDSA相关

2017-11-22 18:02 357 查看
这篇封装了STM32加密库中ECC部分的一些东西,从ST官方提供的例程里分离出来的。

这部分的东西堆了很久了,拿出来回顾一下

ECC加密

椭圆加密算法(ECC)是一种公钥加密体制,是一种非对称加密方式,用私钥进行签名,公钥进行验签。公钥由于公开性所以都是基于数学难题,往往我们在知道私钥的得到公钥的过程会相对简单,但从公钥恢复出私钥的难度需要大量的计算,几乎是不太可能的,从而达到加密的效果。ECC比广泛使用的RSA的加密性能更好。

具体网上相关介绍的挺多的:

https://www.pediy.com/kssd/pediy06/pediy6014.htm

http://blog.csdn.net/sszgg2006/article/details/41945163

这里有个短视频 把加密的原理讲的非常简单了

http://www.bilibili.com/video/av5795530/

描述一个利用椭圆曲线进行加密通信的过程:

  1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。

  2、用户A选择一个私有密钥k,并生成公开密钥K=kG。

  3、用户A将Ep(a,b)和点K,G传给用户B。

  4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数r。

  5、用户B计算点C1=M+rK;C2=rG。

  6、用户B将C1、C2传给用户A。

  7、用户A接到信息后,计算C1果就是点M。因为

C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M

ECDSA签名的原理

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。

签名过程如下:

1、选择一条椭圆曲线Ep(a,b),和基点G;

2、选择私有密钥k ( k小于n,n为G的阶),利用基点G计算公开密钥K=kG;

3、产生一个随机整数r(r小于n),计算R=rG;

4、将原数据和点R的坐标值x,y作为参数,计算hash,即Hash=SHAXX(原数据,x,y);

5、计算s≡r - Hash * k (mod n)

6、r和s做为签名值,如果r和s其中一个为0,重新从第3步开始执行

验证过程如下:

1、接受方在收到消息(m)和签名值(r,s)后,进行以下运算

2、计算:sG+H(m)P=(x1,y1), r1≡ x1 mod p。

3、验证等式:r1 ≡ r mod p。

4、如果等式成立,接受签名,否则签名无效。

网上关于STm32 Cryptography library的东西比较少。官方只提供的文件和相关的例程。

ECC私钥生成

官方流程图如下:





流程如下:

1.初始化随机引擎:ECCinitEC

2.初始化椭圆参数

3.生成私钥

5.获得私钥的值

6.生成公私钥对

ECC签名

官方流程图如下:





流程如下:

1.初始化hash并计算hash,在后面签名的时候用到

2.初始化随机数引擎

3.初始化ECC椭圆参数:ECCinitEC

4.初始化并设置私钥:ECCinitPrivKey ECCsetPrivKeyValue

5.初始化ECDSA结构体并对私钥进行ECDSA签名:ECDSAsign ECDSAinitSign

加入摘要,这个过程中间应该包括了生成公钥的过程。具体见前面ECDSA的签名过程。

6.获得ECDSA签名:获得签名的R,S:ECDSAgetSignature

ECC认证过程

官方提供流程图如下:





流程如下:

1.初始化hash并计算,在后面认证的时候用到

2.初始化椭圆参数:ECCinitEC

3.导入公钥点(已知的):ECCinitPoint, ECCsetPointCoordinate

4.验证公钥是否有效:ECCvalidatePubKey

5.初始化ECDSA签名模块并设置

6.初始化签名数据结构并导入:ECDSAinitSign ECDSAsetSignature

这里导入的为签名的R,S数据

7.ECDSA签名:ECDSAverify

传入message 签名是否成功

代码

https://gitee.com/ShaiChengYuGan/STJiaMiKuECDSAQianMingJiRenZheng.git

说明:

1.主要是ECDSA的签名和认证。运行平台STM32F103

2.P_192 这里其实表达的是一个192位(24字节)的大数,如前面所说,数位数越多越安全。椭圆的参数采用的是ST官

方库提供的参数。

3.这里解释一下hash的函数

4.具体函数的用法可以参照STM32 Cryptographic Library的参考手册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ECDSA stm32 算法 加密