轉自: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,之后也還有許多的問題這里就說說這個相對拖得比較久一點的問題。