C++ OPENSSL 只有十六进制的公钥如何得到EC_POINT
时间: 2024-09-30 12:07:26 浏览: 30
在 OpenSSL 中,当你只有十六进制形式的 EC 公钥时,你需要将其转换为 EC 点结构 (EC_POINT) 才能进行加密解密等操作。以下是步骤:
1. **解析十六进制字符串**:
首先,你需要将十六进制字符串解析成字节序列。这通常涉及到将每两个字符(即一个字节)视为一个大端(Big-Endian)的字节。
```cpp
std::vector<uint8_t> hexKey;
// 将十六进制字符串分割并添加到向量中
for (size_t i = 0; i < hexKeyStr.size(); i += 2) {
hexKey.push_back(std::stoul(hexKeyStr.substr(i, 2), nullptr, 16));
}
```
2. **创建 EC_KEY 结构**:
创建一个 `BIGNUM` 对象来存储解析后的数值,并使用它来构建 `EC_KEY` 对象。
```cpp
BN_CTX* ctx;
BIGNUM* bnKey;
EC_KEY* eckey;
ctx = BN_CTX_new();
bnKey = BN_bin2bn(&hexKey[0], hexKey.size(), nullptr);
eckey = EC_KEY_new_by_curve_name(NID_secp256k1); // 使用合适的曲线名称
if (!bnKey || !eckey) {
// 错误处理...
}
```
3. **设置 EC 点**:
利用 `EC_POINT_oct2point` 函数,将 `bnKey` 转换为 EC 点。
```cpp
EC_POINT* point;
point = EC_POINT_new(eckey);
if (!EC_POINT_oct2point(ctx, point, &hexKey[0], hexKey.size(), BN_CTX_get(ctx))) {
// 错误处理...
}
```
4. **检查点是否有效**:
在此之后,你可以通过 `EC_POINT_is_at_infinity` 检查点是否为无穷大,如果不是,则说明成功转换。
```cpp
if (!EC_POINT_is_at_infinity(eckey, point)) {
// 点有效,可以用于后续的操作
} else {
// 点无效...
}
```
阅读全文