转自: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,之后也还有许多的问题这里就说说这个相对拖得比较久一点的问题。

最新文章

  1. consolel API大全-附测试结果
  2. 寻觅[Getting Answers]
  3. 误删除libc.so.6 恢复
  4. WebRTC之带宽控制部分学习(1) ------基本demo的介绍
  5. 【转】PowerShell入门(三):如何快速地掌握PowerShell?
  6. fifter过滤器
  7. 创建Java类并实例化的基本过程
  8. matlab 画框(二) 去白边
  9. dbd到mongo的序列化问题及稳定性
  10. [源代码] - C#代码搜索器 - 续
  11. 【转载】Git的安装与使用
  12. python测试框架总结
  13. python 初学之账户登录
  14. C#导出文本内容到word文档源码
  15. 技巧 筛1~n的所有因子
  16. Kali学习笔记14:SMB扫描、SMTP扫描
  17. ajax获取后台数据渲染(整片文章不分段落)解决方案,要使用htmL方式输出
  18. 使用普通用户执行 docker
  19. CSS 尺寸 (Dimension) 实例
  20. FASTREPORT COM/ActiveX报表如何保存到C++项目中?

热门文章

  1. connect ECONNREFUSED 127.0.0.1:80错误解决
  2. Ubuntu 16.04安装ANSYS 2019 R1
  3. centos gcc编译
  4. PR代码提交规范
  5. c# winform禁止窗口多开
  6. Qt 实现超时锁屏
  7. python 关于celery的异步任务队列的基本使用(celery+redis)【无配置文件设置】
  8. protobuf, python Enum
  9. 单口 RAM、伪双口 RAM、真双口 RAM、单口 ROM、双口 ROM 到底有什么区别呢?
  10. 乘法器——Wallace树型乘法器