[加密]非对称加密STM32实现
转自:https://blog.csdn.net/kangerdong/article/details/82432701
把所有的准备工作都做完了以后,可以将加密算法移植到我们具体的项目中去了,在STM32中在出厂前已经将RSA的公钥私钥,CA数字签名和CA公钥烧写在STM32的flash上了。
4.1 身份认证
在wifi连接上服务器上后,客户端首先发起交换密钥请求,客户端将自己的RSA公钥,CA数字签名发送给服务器,服务器将自己的公钥,CA数字签名(是利用CA的私钥对服务器公钥机密的一段密文),以及加密后(利用的是客户端的公钥加的密)的AES密钥(为了减小STM32的负担,随机密钥由服务器产生就随身份认证的信息一起发送过来了)发送给客户端。客户端接收到服务器的信息后,首先对服务器公钥做MD5处理,然后调用STM32密码库中的签名认证函数进行认证,通过则进行后续操作,失败客户端进入休眠状态(wifi不可操作),服务器进行类似的处理。
4.2 解密AES密钥
将得到的包含AES密钥的密文利用RSA私钥进行解密,将得到AES的随机密钥。随后的数据传输将利用这个密钥和AES算法进行加密传输。
项目上的代码不好贴上面还有好多的细节问题需要处理,大多数是C语言的数据处理问题,有什么问题可以留言我。服务器利用的是openssl加密库,可以实现生成rsa,加密,解密等等一系列操作,比STN32的加密库要强好多好多。
4.3 利用openssl生成RSA密钥对
利用 openssl genrsa -out rsa_private_key.pem 1024 生成rsa密钥,这个文件包含了私钥和公钥。
利用 openssl asn1parse -in rsa_private_key.pem
说起这个密钥问题到现在都有点心酸负责服务器那边的人死活不认n,e,d,服务器那边出来的密钥都是什么PKCS#8格式的说是需要我这边来进行处理,我当时也是懵逼的这又是些什么东西啊。无奈之下又去研究PKCS#8和n,e,d的关系,有衍生出一系列的RSA密钥的规范问题,但是这不是最恐怖的。最恐怖的是STM32F103C8T6的flash爆炸了。我也有心无力,最后我只能从服务器端入手找到了如上的方法,经过几经周转对方终于答应放弃了他们原先的密码库换成了openssl,之后也还有许多的问题这里就说说这个相对拖得比较久一点的问题。
最新文章
- consolel API大全-附测试结果
- 寻觅[Getting Answers]
- 误删除libc.so.6 恢复
- WebRTC之带宽控制部分学习(1) ------基本demo的介绍
- 【转】PowerShell入门(三):如何快速地掌握PowerShell?
- fifter过滤器
- 创建Java类并实例化的基本过程
- matlab 画框(二) 去白边
- dbd到mongo的序列化问题及稳定性
- [源代码] - C#代码搜索器 - 续
- 【转载】Git的安装与使用
- python测试框架总结
- python 初学之账户登录
- C#导出文本内容到word文档源码
- 技巧 筛1~n的所有因子
- Kali学习笔记14:SMB扫描、SMTP扫描
- ajax获取后台数据渲染(整片文章不分段落)解决方案,要使用htmL方式输出
- 使用普通用户执行 docker
- CSS 尺寸 (Dimension) 实例
- FASTREPORT COM/ActiveX报表如何保存到C++项目中?
热门文章
- connect ECONNREFUSED 127.0.0.1:80错误解决
- Ubuntu 16.04安装ANSYS 2019 R1
- centos gcc编译
- PR代码提交规范
- c# winform禁止窗口多开
- Qt 实现超时锁屏
- python 关于celery的异步任务队列的基本使用(celery+redis)【无配置文件设置】
- protobuf, python Enum
- 单口 RAM、伪双口 RAM、真双口 RAM、单口 ROM、双口 ROM 到底有什么区别呢?
- 乘法器——Wallace树型乘法器