在開發類似《部落衝突·皇室戰爭》的即時對戰遊戲 Demo 時,網絡模塊是核心基礎設施之一。客戶端使用 Unity (C#),服務端採用 C++。為了確保通訊安全,協議設計採用兩階段加密:首先客戶端以 RSA 非對稱加密請求服務端,獲取 RC4 對稱加密密鑰;雙方隨後使用 RC4 進行高效通訊。本文聚焦於服務端(Linux/C++)如何利用 OpenSSL 庫實現 RSA 加解密邏輯。
RSA 是非對稱加密算法,擁有公鑰與私鑰。公鑰加密的數據只能由對應私鑰解密,反之亦然。這特性完美契合「密鑰交換」場景:客戶端用服務端公鑰加密隨機生成的 RC4 密鑰發送,服務端用私鑰解密得到對稱密鑰,後續通訊改用高速的 RC4。
在 Linux 環境下,使用 OpenSSL 指令即可生成 2048 位元的 RSA 密鑰對:
# 生成私鑰(含公鑰資訊)
openssl genrsa -out private.pem 2048
# 從私鑰導出公鑰
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
OpenSSL 提供 RSA_public_encrypt 與 RSA_private_decrypt 兩個核心函數。典型流程如下:
RSA* 結構體(PEM_read_RSA_PUBKEY / PEM_read_RSAPrivateKey)。RSA_public_encrypt(data_len, from, to, rsa, RSA_PKCS1_PADDING) 加密,輸出長度固定為密鑰位元數/8(2048-bit 為 256 字節)。RSA_private_decrypt 還原明文。編譯時需鏈接 -lcrypto 庫。測試程式輸出確認加密長度 256 字節,解密後完美還原「Hello this is tab_space」。
RSA_PKCS1_PADDING 或更安全的 RSA_PKCS1_OAEP_PADDING。密鑰位元數/8 - 11(PKCS#1 v1.5)。實務上僅用於加密對稱密鑰(如 16/32 字節 RC4/AES Key)。ERR_get_error() 獲取 OpenSSL 錯誤碼。RSA_free() 釋放結構體,防止記憶體洩漏。本文詳述服務端 C++ 利用 OpenSSL 完成 RSA 密鑰交換的完整流程。下一篇將切換視角,講解 Unity (C#) 客戶端如何實現對應的 RSA 加密請求,打通端到端加密鏈路。