最近,需要新做一個游戲demo,類似《部落沖突·皇室戰爭》的推塔玩法。客戶端使用Unity,編程語言為C#,服務端使用C++。由於從零開始,需要建立基礎部件,其中網絡模塊是最重要的模塊之一。網絡模塊協議遵從如下圖步驟時序圖進行通信。
由上圖可以看出網絡通信主要分為兩個步驟,第一步:客戶端使用RSA加解密請求通信服務端,獲取RC4秘鑰;第二步:客戶端與服務端使用RC4加解密通信。本文主要介紹第一步中在Server端(C++)的RSA加解密模塊。
注:本文不敘述網絡模塊中的框架設計,只關注在客戶端/服務端獲得加密消息後,進行解密的技術環節。
RSA為非對稱加密方式,在C/C++中是基於使用OpenSSL庫來實現。通過以下4個步驟來簡單講述。
RSA的私鑰包含了公鑰的信息,所以首先通過以下命令產生長度為2048的RSA私鑰。
openssl genrsa -out private.pem 2048
這樣private.pem就會生成在當前目錄下,使用以下命令就可以從private.pem提取出public.pem。
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
如此,就產生兩個秘鑰,不難猜出:
public.pem是使用PEM格式的公鑰,而private.pem是對應的私鑰。
RSA是一種非對稱的加解密方式。基於它的特性,它可以以公鑰加密,然後私鑰解密;也可以以私鑰加密,公鑰解密。本小節羅列下OpenSSL對於RSA提供的接口:
[root@xxx crypt]# g++ -o bin/example -I/usr/include/openssl/ -lcrypto src/example.cpp
打印的結果:
[root@xxx crypt]# bin/example Encrypted length =256 Decrypted Text =Hello this is tab_space Decrypted Length =23 Encrypted length =256 Decrypted Text =Hello this is tab_space Decrypted Length =23
本文講述了在服務端(Linux/C++)使用OpenSSL庫對通信消息進行RSA非對稱加解密的技術過程,下一篇會講述客戶端(Unity/C#)使用OpenSSL庫對通信消息進行RSA加解密的技術過程。