小餅-帶你爬那些年爬過的RSA坑 iOS RAS加密 以及與 .NET 之間的通訊問題,rsaios

來源:互聯網
上載者:User

小餅-帶你爬那些年爬過的RSA坑 iOS RAS加密 以及與 .NET 之間的通訊問題,rsaios
背景

首先最近我們在做一個APP 但是我們資料互動都是明文的=- = 這咋辦勒,傻子也知道加密一下咯。可是加密也有問題 對稱式加密的話,人家破解你的應用就能知道了。所以用到了非對稱式加密並且每個APP產生不同的RSA金鑰組。

初步實現

實現再iOS上面實現RSA加密並不難,因為iOS中有openssl 和 系統內建的 security.framework。我這裡選擇了openSSL 因為我比較懶 =- = 發現別人已經寫好了 直接就用了唄。security.framework其實也不錯的,就是我還不知道咋用。

初試OpenSSL RSA

Demo地址
這個是GitHub上面一個人寫好的,實現了OpenSSL 的RSA加密

問題

1.在iOS上 使用OpenSSL 產生的公開金鑰私密金鑰編碼是X509的,而我們伺服器使用的是.NET的(.NET的編碼是PKCS#8) PS:(←。 ←)我也不知道對不對,這幾天百度的結果是醬紫的,
.NET與JAVA(android)RSA通訊 可以參考這個地址,我個人總結的是,JAVA支援集中不同的編碼格式,所以JAVA通訊問題不大
2.如何轉換不同的認證

過程

1.先找了如何讓兩個產生的密文一樣,但是發現有paddingPKCS1這種東西肯定不行(宣告失敗)
2.想辦法產生一個PKCS#8的金鑰組(我試了一些openssl的命令列,可是最終金鑰組要app產生的,所以沒繼續,也宣告失敗了)
3..NET服務端使用openssl解決該問題(可是如果這樣的話 ,android又需要修改,所以宣布放棄了)
4.轉換金鑰組編碼(其實其中我還找了 iOS與Java通訊之類的,這裡我就不一一闡述了)

這個彎路其實挺長的,我總結了一下是這麼幾點,但是曆史一天時間了。。。

主要我就來講一下最後一點吧。肯定會有朋友問我是這麼發現這兩個金鑰組的區別的。
不要著急,我們廣告之後繼續。

解決問題

首先我建議各位下載一下那個github裡面的代碼,這樣容易理解。
當你運行完一次程式,你會發現你的iPhone模擬器目錄下面會有 publicKey.pem 和 privateKey.pem
我們需要把publicKey交給服務端,這樣他加密的東西,只有我這個privateKey可以解,這些原理我就不多做說明了。

然後我們開啟publicKey會是一下

     /*     This return value based on the key that generated by openssl.     -----BEGIN RSA PUBLIC KEY-----     MIGHAoGBAOp5TLclpWCaNDzHYPfB26SLmS8vlSXH4PyKopz5OS5Vx994FBQQLwv9     2pIJQsBk09egrL0gbASK1VCwDt0MmaiyrNFl/xaEzB/VOvjoojBUzMMIca9fKmx5     GAzSbSP7we64dhvrziuuNVTuM/e2XSa2skKFHMI0bCq4+pNYhvRhAgED     -----END RSA PUBLIC KEY-----     */

然後我們看一下原始碼

- (NSString*)publicKeyBase64{  NSFileManager *fm = [NSFileManager defaultManager];  if ([fm fileExistsAtPath:OpenSSLRSAPublicKeyFile])   {      NSString *str = [NSString stringWithContentsOfFile:OpenSSLRSAPublicKeyFile encoding:NSUTF8StringEncoding error:nil];      NSData *data = [self publicKeyBitsWithString:[[str componentsSeparatedByString:@"-----"] objectAtIndex:2]];      return [data base64EncodedString];  }  return nil;}

 

這裡我們看到OpenSSL將整個認證檔案Base64了一下,沒錯,這裡確實沒錯。

我起初再這裡還繞彎了 我以為是key錯誤了。其實OpenSSL 正確的publicKey轉NSData後 大小一定是162,如果你只是其中那一段(沒有----****----這兩行的話)就是140了。
我同事在查看OpenSSL.NET的原始碼的時候發現了一段轉換過程,然後我看了一下.NET端的代碼,代碼如下
看得懂.net的或者看不懂.NET的應該都可以看的懂很簡單的代碼。

so 我饒了這麼大的彎子,你們應該一看就知道了接下來就是處理了,這麼讓publicKey變成128-》PKCS#8標準的編碼呢,按照.NET的OpenSSL代碼翻譯下一下

if((unsigned long)[NSData dataWithBase64EncodedString:wrapper.publicKeyBase64].length<162){    NSLog(@"公開金鑰格式不正確!");    return;}else{    //取出.NET可以使用的 PubKey    NSData *keyData=[NSData dataWithBase64EncodedString:wrapper.publicKeyBase64];    NSData * newKeyData =[keyData subdataWithRange:NSMakeRange(29, 128)];    NSLog(@"NewPubKey:%@",[newKeyData base64EncodedString]);}

 

小結

上面這個就是我的處理過程 =- = 這次的這個RSA的坑是真坑啊,我要是沒看服務端代碼 肯定搞不出來,因為本地加解密都是OK的,唉,所以這件事情告訴我們,看問題必須得從多個方面看,而且不能只是看自己手頭上的可以從多個方面入手尋找資料。不過這次也是因為我會.NET所以我會想到去看一下。
這個坑記錄一下 希望可以幫到大家
這個是前一段時間坑過的一個東西,發現網上都找不到資料 古留下這篇文章...

我也坑過AES 可以看我的個人部落格,當然我也會更新到這裡來~

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.