首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ RSA 公鑰加密:十六進位字串轉換為 OpenSSL 所需的 BIGNUM/二進位緩衝區

     編輯:程式設計綜合問答

已有十六進位格式的 RSA 公鑰(如 "123A123A...")與待加密資料("F12F45F1..."),需呼叫 RSA_public_encrypt (OpenSSL) 或同類 API。關鍵在於資料類型轉換。

公鑰處理:十六進位 → BIGNUM → RSA 結構

// 1. 十六進位字串轉 BIGNUM
BIGNUM *bn = BN_new();
BN_hex2bn(&bn, "123A123A123F13123F123F123F12F1F1FFF");

// 2. 建立 RSA 結構並設定 n (modulus) 和 e (public exponent)
// 假設 e = 65537 (0x10001)
BIGNUM *e = BN_new();
BN_set_word(e, 65537);

RSA *rsa = RSA_new();
rsa->n = bn;   // modulus
rsa->e = e;    // public exponent
// 若有 d、p、q 等私鑰參數則對應設定,公鑰加密只需 n、e

資料處理:十六進位 → 二進位緩衝區

// 將十六進位字串轉為 unsigned char 陣列
std::vector<unsigned char> data;
for (size_t i = 0; i < hexStr.length(); i += 2) {
    data.push_back((unsigned char)strtol(hexStr.substr(i, 2).c_str(), nullptr, 16));
}
// data.data() 即為加密輸入緩衝區

呼叫加密

int rsaSize = RSA_size(rsa);
std::vector<unsigned char> encrypted(rsaSize);
int len = RSA_public_encrypt(data.size(), data.data(), encrypted.data(), rsa, RSA_PKCS1_PADDING);
if (len == -1) { /* ERR_get_error() 處理錯誤 */ }

關鍵提醒

  • OpenSSL 期望輸入為二進位位元組陣列,非十六進位字串。
  • 公鑰模數 n 長度決定最大加密資料長度(PKCS#1 v1.5 padding 下為 rsaSize - 11 位元組)。
  • 記得 RSA_free、BN_free 釋放資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved