STM32加密库—ECC,ECDSA相关
来源:互联网 发布:mac找不到图片文件夹 编辑:程序博客网 时间:2024/05/16 14:51
这篇封装了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的参考手册
- STM32加密库—ECC,ECDSA相关
- ECC-ECDSA
- 关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)
- ECC-based 算法(ECDSA/ECDH) 新潮算法的原理
- ECDH and ECDSA(ECC椭圆曲线算法3)
- android ecc 加密
- 椭圆曲线加密ECC
- 在apache配置ecdsa加密套件
- ECC 加密说说(1)
- ECC 加密说说(二)
- 椭圆曲线ECC加密实例
- stm32 加密
- STM32 ECC校验的一些心得
- Java加密技术(七)——非对称加密算法最高级ECC
- Java加密技术(七)——非对称加密算法最高级ECC
- Java加密技术(七)——非对称加密算法最高级ECC
- Java加密技术(七)——非对称加密算法最高级ECC
- Java加密技术(七)——非对称加密算法最高级ECC
- 欢迎使用CSDN-markdown编辑器
- caffe之blob_demo.cpp正常运行大法
- c学习笔记-作业-冒泡升序
- Mybatis 分页查询数据(借用map来封装参数)
- HDOJ 1016 Prime Ring Problem(DFS深度优先搜索)
- STM32加密库—ECC,ECDSA相关
- 第八章El表达式第四节el表达式对象操作
- pandas reshape
- 迭代器失效的总结
- 【Linux内核驱动】基于platform总线的miscdevice驱动(LED)
- 树莓派
- 启动本地项目方法
- spark 编译安装
- tomcat6-源码分析(2)