这篇封装了STM32加密库中ECC部分的一些东西,从ST官方提供的例程里分离出来的。
这部分的东西堆了很久了,拿出来回顾一下
ECC加密
椭圆加密算法(ECC)是一种公钥加密体制,是一种非对称加密方式,用私钥进行签名,公钥进行验签。公钥由于公开性所以都是基于数学难题,往往我们在知道私钥的得到公钥的过程会相对简单,但从公钥恢复出私钥的难度需要大量的计算,几乎是不太可能的,从而达到加密的效果。ECC比广泛使用的RSA的加密性能更好。
具体网上相关介绍的挺多的:
https://www.pediy.com/kssd/pediy06/pediy6014.htm
这里有个短视频 把加密的原理讲的非常简单了
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的参考手册