談?wù)刬os與.net的rsa埃脏、aes交互加密解密的坑(已附上demo)

前言

由于學(xué)校要求,需要做一個與安全傳輸相關(guān)的小項目秋忙,項目大小不要緊彩掐,功能不完善不要緊,只要能體現(xiàn)安全傳輸灰追,主要功能實現(xiàn)堵幽,能跑起來就行,于是我決定基于socket弹澎,tcp來做一個以.net為服務(wù)端朴下,ios為客戶端的簡單聊天室,然后使用rsa與aes來模仿https的加密過程苦蒿。一開始我以為很簡單殴胧,以為加密算法是知道的直接套用就好,結(jié)果,發(fā)現(xiàn)坑好多 = =

Demo地址

iosDemo
c#Demo

關(guān)于aes和rsa

aes是對稱加密团滥,rsa是非對稱加密竿屹,什么是對稱加密和非對稱加密自己去網(wǎng)上了解了解,這里就不多說灸姊,rsa原理可以看這里,ase可以看這里拱燃。
rsa和ase的加密原理可以不懂,但什么是對稱加密和非對稱加密一定要知道是什么概念厨钻,不然這篇文章你是看不懂的扼雏。

加密流程

主要是模仿https的過程,只是我把服務(wù)器和客戶端的加密角色反過來了夯膀。

  • 首先在客戶端連接服務(wù)器后生成rsa的公鑰和密鑰诗充,并把公鑰發(fā)送給服務(wù)器
  • 服務(wù)器收到rsa的公鑰后對此客戶端的socket對象生成一個隨機的對應(yīng)的aes密鑰,并使用rsa公鑰進行加密發(fā)送給客戶端诱建。
  • 客戶端收到加密過的aes密鑰后使用rsa的密鑰進行解密得到aes的密鑰并保存起來
  • 之后客戶端與服務(wù)端的數(shù)據(jù)傳輸都使用aes密鑰進行加密/解密蝴蜓。

加密順序圖:

加密順序圖

第三方庫

那些坑!0吃场茎匠!

  • rsa

一開始我以為直接用網(wǎng)上的庫可以不使用openssl來生成證書來生成rsa的公鑰和密鑰,然后直接吧公鑰和發(fā)給服務(wù)器加密就好了押袍,但我簡單的試了一試诵冒,發(fā)現(xiàn)不行,無法相互加密解密谊惭,結(jié)果我發(fā)現(xiàn)ios那邊生成的公鑰是這樣子的……

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTbZ6cNH9PgdF60aQKveLz3FTalyzHQwbp601y77SzmGHX3F5NoVUZbdK7UMdoCLK4FBziTewYD9DWvAErXZo9BFuI96bAop8wfl1VkZyyHTcznxNJFGSQd/B70/ExMgMBpEwkAAdyUqIjIdVGh1FQK/4acwS39YXwbS+IlHsPSQIDAQAB

然后.net那邊是這樣的……

<RSAKeyValue>
  <Modulus>veJTjzABfYl9/9YbOOw+EcfIZ1jajWiGPAXW+G/2uIUYh9L9WSyLPghl3oMZM2GDxp9f+chdc0k9lrNbJwsIaereleTiOcl2u/rq+jS8r2WhTfk8bIMWeAO/B5S0IjIbmKXdymRNZFw/KjuY99HdYk6nB1MZ1AJ/e3xJKwWJrXp55Y4DlX9sGTORS9kcy1q4fuxjJHUFAYsasV/vnsjlaau4sp6xBcDIfT1tRkxMZriDPW3J7qH7/qI2X4+iQZQIfAyFpSlqi+4GI9FajogEareCS7d1vc+OYdGc+jX1h0erHsRtlvFHzLcqBmZQ0Gz0XdZxOwJf5vhxUvvoK9BmBw==</Modulus>
  <Exponent>AQAB</Exponent>
</RSAKeyValue>
坑爹呢汽馋!這是!

格式壓根不一樣好吧H1尽!為啥.net是xml扒谩L浮!V谡!握牧!
后來我把<Modulus>標簽里面的公鑰提出來發(fā)現(xiàn)還是不行…………

突然投降

后來各種谷歌stackoverflow,發(fā)現(xiàn)原來在iOS上使用OpenSSL生成的公鑰私鑰編碼是X509的娩梨,而.NET的編碼是PKCS#8沿腰,所以并不兼容。于是繼續(xù)各種谷歌stackoverflow姚建,終于找到個ios端支持.net端那種的加密解密格式rsa框架(EncryptionForiOS)矫俺,但這個框架有個缺點,就是無法用服務(wù)端生成的公鑰進行加密,而是只能用自身生成的公鑰進行加密厘托,這就是為什么我的客戶端服務(wù)器和https的加密模式反過來的原因友雳。
不過依然需要注意的是,這個框架生成的公鑰并不是xml格式的铅匹,所以我們要使用字符串拼接成xml格式押赊,服務(wù)端才能加密。

NSString* publicKey=[[NSString alloc]initWithFormat:@"<RSAKeyValue><Modulus>%@</Modulus><Exponent>%@</Exponent></RSAKeyValue>",[self.rsaHelper getPublicKey],[self.rsaHelper getExponent]];

于是服rsa這塊就成功了………………

  • aes

我認為aes比rsa更坑包斑,首先一樣的我先在.net端生成aes的密鑰然后用rsa公鑰給加密發(fā)給ios端流礁,ios端再用rsa的密鑰解密得到aes的密鑰,因為rsa已經(jīng)成功了罗丰,所以到這步為止都是沒問題的神帅,所以說下一步問題就來了…………
首先還是在ios端用aes的密鑰加密,然后發(fā)送給服務(wù)端解密萌抵,結(jié)果無法解密找御,不過這也已經(jīng)預(yù)料到了,后來發(fā)現(xiàn)原因是在ios上我使用的aes128算法绍填,而.net上的是aes256算法霎桅,所以無法解密,于是還是各種谷歌stackoverflow讨永,找了n多的框架(上面的EncryptionForiOS雖然里面也有提供aes的解密滔驶,但各種原因讓我一開始以為他是無效的,但實質(zhì)上有待驗證)卿闹,最好我找到了個配套的ios端和.net端相互配合的框架揭糕,RNCryptor-objcRNCryptor-cs,我想這下子沒錯了吧1仍2宸稹杠巡!都是同一個框架同一個作者寫的東西量窘,不會不兼容吧!G庥怠蚌铜!
結(jié)果,依然無法相互加密解密…………

突然投降

后來我觀察的傳輸?shù)男畔?br> ios端傳輸前的base64string是這樣的

AwGNQlDqaaPn/xGqIm94l1sJYn7su/3wQiUMN/7h2VJeFVjB1NVycu/evTPz+IVuBfLbtY7Wzh0p4Jmlk1jzvc6Wd053+YxaZCpsKbbC3KuZMw==

到了.net端的base64string就變成這樣了………………

AwGNQlDqaaPn/xGqIm94l1sJYn7su/3wQiUMN/7h2VJeFVjB1NVycu/evTPz+IVuBfLbtY7Wzh0p4Jmlk1jzvc6Wd053+YxaZCpsKbbC3KuZMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
這不還是坑爹嗎嫩海?

臥槽冬殃??叁怪?哪來的這么多A审葬???涣觉?痴荐?
我研究了好久…………網(wǎng)上也沒找到答案…………后來我把byte的長度輸出來看看,發(fā)現(xiàn)ios那邊是按我輸入的字符多少來的官册,而到了.net端就永遠都是1024………………然后我大概明白了…………
其實看看我拿來接收信息的byte[]就懂了……

byte[] recvBytes = new byte [1024];
int ReceiveCount = cs.clientSocket.Receive (recvBytes,recvBytes.Length,0);

對的生兆,沒錯我拿來接收信息的byte[]大小是1024,于是我把這個byte轉(zhuǎn)成base64string的時候膝宁,c#自動把空缺的部分用A填充了Q荒选!员淫!于是便變成這樣…………(==是代表結(jié)束合蔽,所以A填充在了==前面)

于是我的解決方法是這樣的

byte[] recvBytes = new byte [1024];
int ReceiveCount = cs.clientSocket.Receive (recvBytes,recvBytes.Length,0);
if(ReceiveCount!=0)
{
   byte[] recvByte = new byte [ReceiveCount];
   for(int t=0;t<ReceiveCount;t++)
   {
      recvByte[t]=recvBytes[t];                      
   }                        
   string ciphertext = Convert.ToBase64String(recvByte);
}

于是ciphertext就可以正常加密解密了…………于是aes也ok,整個程序就能正常運行了~

運行情況

直接上截圖吧


電腦端

手機端

可以看到手機顯示的和電腦端的模擬器同步并且傳輸?shù)膬?nèi)容成功加密解密(控制臺上輸出的是密文)
至此介返,整項目到此為止辈末,我可以交作業(yè)了~

后記

也許有人說啊,直接用https不就得了嗎映皆?干嘛這么辛苦挤聘。但其實知識和錢一樣,永遠都不嫌多捅彻,難道不是嗎组去?
最后的最后,感謝github步淹,感謝stackoverflow从隆,感謝開源!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缭裆,一起剝皮案震驚了整個濱河市键闺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澈驼,老刑警劉巖辛燥,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缝其,居然都是意外死亡挎塌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門内边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榴都,“玉大人,你說我怎么就攤上這事漠其∽旄撸” “怎么了竿音?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拴驮。 經(jīng)常有香客問我谍失,道長,這世上最難降的妖魔是什么莹汤? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任快鱼,我火速辦了婚禮,結(jié)果婚禮上纲岭,老公的妹妹穿的比我還像新娘抹竹。我一直安慰自己,他們只是感情好止潮,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布窃判。 她就那樣靜靜地躺著,像睡著了一般喇闸。 火紅的嫁衣襯著肌膚如雪袄琳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天燃乍,我揣著相機與錄音唆樊,去河邊找鬼。 笑死刻蟹,一個胖子當著我的面吹牛逗旁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舆瘪,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼片效,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了英古?” 一聲冷哼從身側(cè)響起淀衣,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎召调,沒想到半個月后膨桥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡某残,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年国撵,在試婚紗的時候發(fā)現(xiàn)自己被綠了陵吸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻墅。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壮虫,靈堂內(nèi)的尸體忽然破棺而出澳厢,到底是詐尸還是另有隱情环础,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布剩拢,位于F島的核電站线得,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徐伐。R本人自食惡果不足惜贯钩,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望办素。 院中可真熱鬧角雷,春花似錦、人聲如沸性穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽需曾。三九已至吗坚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呆万,已是汗流浹背商源。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谋减,地道東北人炊汹。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像逃顶,于是被迫代替她去往敵國和親讨便。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容