Windows 8 系列(四):Win8 RSA加密相關問題


最近好久沒有發win8系列的文章了,這段時間工作中積累了一些經驗和問題,現在拿出來跟大家分享一下。

 

關於RSA加密算法,在Win8中用起來不太方便。不像其他平台一樣導入證書文件或者導入N值、E值,而是需要導入ASC碼數據。據說windows phone中也一樣,需要把密鑰中的信息解析成ASC碼,組成數組,用AsymmetricKeyAlgorithmProvider.ImportPublicKey()方法才能導入。相關代碼如下:(nBytes就是ASC碼數據,類型為byte[])

 

 

在Windows Phone中,直接導入由密鑰產生的數組就可以,但是Win8上總是提示失敗,編譯不過,提示ASN1 bad tag value met.。如下圖:

 

 

由於目前Win8和相關參考資料較少,還沒有多少開發者真正的遇到過這些問題,所以,我的同事只能從一些其他平台的RSA數據包的例子中參考,經過近一天時間的查找,終於在一次測試中通過了,解決辦法是在原密鑰ASC碼數組的前面加入了“82, 83, 65, 49, 0, 4, 0, 0, 3, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,”這一段ASC碼值,將這一串ASC碼轉換成字符后是

這個相當於是一個信息頭。

面對無資料可循的問題,我們能夠解決這個問題,實屬不易,如果沒有遇到那個例子,不知道何時才能解決這個問題。這個問題雖然暫時解決了,但是我們並沒有找到解決這個問題的根本辦法,如果這個問題以后再次出現,我們就不知道還得“試”到什么時候

 

擔心的事情終究是發生了,在安裝了最新發布的Win8系統升級包后,這里報錯了。起初我們還以為是API變化導致的,可是我們看了API文檔后沒有找到相關可以解決的辦法,最后我們求助了微軟,想知道是系統的問題,還是API的問題,還是我們自己的問題。

我們再次在這個問題上花費了將近兩天的時間,終於在 @馬蔬菜(新浪微博)的幫助下,我們走入了正途,他發現API中有個CreateKeyPair方法,可以創建指定長度的Key,於是,我們用這個方法同時創建了兩個Key,對比他們的相同之處,把它們加入到我們的密鑰數組中,不就OK了嗎?

 

於是我們用了以下代碼:

1             CryptographicKey keyPair = Algorithm.CreateKeyPair(1024);
2             CryptographicKey keyPair2 = Algorithm.CreateKeyPair(1024);
3             var blobOfPublicKey = keyPair.ExportPublicKey();
4             var blobOfPublicKey2 = keyPair2.ExportPublicKey();
5             byte[] newBuffer, newBuffer2;
6             CryptographicBuffer.CopyToByteArray(blobOfPublicKey, out newBuffer);
7             CryptographicBuffer.CopyToByteArray(blobOfPublicKey2, out newBuffer2);

這里需要說明一下,為什么我們創建了1024的,而不是其他的長度呢,我們發現我們的密鑰在轉換成IBuffer對象后的長度是128,1024的key轉換成IBuffer后是162,最接近128,因此應該是會有38位的“頭”和“尾”。

查看newBuffer和newBuffer2的差異后,我們發現頭和尾分別有部分數組元素是一樣的,我們把它們加入到我們的密鑰數組中,再次運行ImportPublicKey()方法,執行通過。至此,我們的RSA加密問題終於解決了,而且是徹底解決了,如果以后這里再報錯,就可以還拿上面這段代碼比較相同的部分,得出“頭”和“尾”。

 

以上是我們工作中遇到的問題和相關的解決方案,希望能夠幫助到大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM