轉自:http://www.javashuo.com/article/p-gmxsgvlr-n.html算法
把全部的準備工做都作完了之後,能夠將加密算法移植到咱們具體的項目中去了,在STM32中在出廠前已經將RSA的公鑰私鑰,CA數字簽名和CA公鑰燒寫在STM32的flash上了。服務器
在wifi鏈接上服務器上後,客戶端首先發起交換密鑰請求,客戶端將本身的RSA公鑰,CA數字簽名發送給服務器,服務器將本身的公鑰,CA數字簽名(是利用CA的私鑰對服務器公鑰機密的一段密文),以及加密後(利用的是客戶端的公鑰加的密)的AES密鑰(爲了減少STM32的負擔,隨機密鑰由服務器產生就隨身份認證的信息一塊兒發送過來了)發送給客戶端。客戶端接收到服務器的信息後,首先對服務器公鑰作MD5處理,而後調用STM32密碼庫中的簽名認證函數進行認證,經過則進行後續操做,失敗客戶端進入休眠狀態(wifi不可操做),服務器進行相似的處理。函數
將獲得的包含AES密鑰的密文利用RSA私鑰進行解密,將獲得AES的隨機密鑰。隨後的數據傳輸將利用這個密鑰和AES算法進行加密傳輸。
項目上的代碼很差貼上面還有好多的細節問題須要處理,大多數是C語言的數據處理問題,有什麼問題能夠留言我。服務器利用的是openssl加密庫,能夠實現生成rsa,加密,解密等等一系列操做,比STN32的加密庫要強好多好多。加密
利用 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,以後也還有許多的問題這裏就說說這個相對拖得比較久一點的問題。 .net