首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 實作 RSA 非對稱加解密:遊戲網絡通訊的關鍵步驟

     編輯:關於C++

前言:為什麼需要 RSA 加密?

在開發類似《部落衝突·皇室戰爭》的即時對戰遊戲 Demo 時,網絡模塊是核心基礎設施之一。客戶端使用 Unity (C#),服務端採用 C++。為了確保通訊安全,協議設計採用兩階段加密:首先客戶端以 RSA 非對稱加密請求服務端,獲取 RC4 對稱加密密鑰;雙方隨後使用 RC4 進行高效通訊。本文聚焦於服務端(Linux/C++)如何利用 OpenSSL 庫實現 RSA 加解密邏輯。

RSA 非對稱加密原理速覽

RSA 是非對稱加密算法,擁有公鑰與私鑰。公鑰加密的數據只能由對應私鑰解密,反之亦然。這特性完美契合「密鑰交換」場景:客戶端用服務端公鑰加密隨機生成的 RC4 密鑰發送,服務端用私鑰解密得到對稱密鑰,後續通訊改用高速的 RC4。

OpenSSL 實戰:生成密鑰對

在 Linux 環境下,使用 OpenSSL 指令即可生成 2048 位元的 RSA 密鑰對:

# 生成私鑰(含公鑰資訊)
openssl genrsa -out private.pem 2048

# 從私鑰導出公鑰
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
  • private.pem:PKCS#1 格式私鑰,服務端妥善保管,用於解密。
  • public.pem:PKCS#1 格式公鑰,分發給客戶端,用於加密。

核心 API:公鑰加密與私鑰解密

OpenSSL 提供 RSA_public_encrypt 與 RSA_private_decrypt 兩個核心函數。典型流程如下:

  1. 讀取 PEM 格式公鑰/私鑰至 RSA* 結構體(PEM_read_RSA_PUBKEY / PEM_read_RSAPrivateKey)。
  2. 呼叫 RSA_public_encrypt(data_len, from, to, rsa, RSA_PKCS1_PADDING) 加密,輸出長度固定為密鑰位元數/8(2048-bit 為 256 字節)。
  3. 服務端收到密文後,呼叫 RSA_private_decrypt 還原明文。

編譯時需鏈接 -lcrypto 庫。測試程式輸出確認加密長度 256 字節,解密後完美還原「Hello this is tab_space」。

工程落地注意事項

  • 填充模式:必須雙端一致,推薦 RSA_PKCS1_PADDING 或更安全的 RSA_PKCS1_OAEP_PADDING。
  • 數據長度限制:RSA 直接加密明文長度不能超過 密鑰位元數/8 - 11(PKCS#1 v1.5)。實務上僅用於加密對稱密鑰(如 16/32 字節 RC4/AES Key)。
  • 錯誤處理:檢查返回值,善用 ERR_get_error() 獲取 OpenSSL 錯誤碼。
  • 資源釋放:用完 RSA_free() 釋放結構體,防止記憶體洩漏。

總結與後續規劃

本文詳述服務端 C++ 利用 OpenSSL 完成 RSA 密鑰交換的完整流程。下一篇將切換視角,講解 Unity (C#) 客戶端如何實現對應的 RSA 加密請求,打通端到端加密鏈路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved