【问题标题】:Extracting Public key from Private key using Botan使用Botan从私钥中提取公钥
【发布时间】:2019-12-13 16:18:32
【问题描述】:

我正在尝试使用非对称私钥-公钥加密消息。 在Botan 中,使用Load_key() 函数,我读取了私钥并想从中提取它的公钥。为了在其构造函数中构造 RSA 公钥,我需要一个“算法标识符”对象和我拥有的“密钥位”。算法标识符对象使用pcks8_algorithm_identifier()函数。

问题是“密钥位”返回 secure_vector<unsigned char> 而不是 vector<unsigned char>,当我想将它传递给 RSA_PublicKey 构造函数时遇到 bad::alloc exception

有人遇到过这样的问题吗?如果有另一种非对称加密方法,即从 Botan 中的输入文件加载密钥,我将不胜感激

【问题讨论】:

标签: c++11 network-programming botan


【解决方案1】:

Botan 使用两个接口来表示非对称密钥对:Public_KeyPrivate_KeyPrivate_Key 接口继承自 Public_Key。因此,当您获得例如RSA_PrivateKey 通过PKCS8::load_key,这个对象已经代表了公钥和私钥。也就是说,您可以将此对象插入到其他需要 Public_Key 的方法中。

为了访问原始密钥位,Public_Key 接口定义了一个std::vector<uint8_t> public_key_bits()Private_Key 接口有一个额外的secure_vector<uint8_t> private_key_bits()。因此,每个Private_Key 实例都应该同时拥有public_key_bitsprivate_key_bits

参考:https://github.com/randombit/botan/blob/master/src/lib/pubkey/pk_keys.h

附加说明:secure_vector 类是一个带有特殊分配器的std::vector,可确保在对象被破坏时覆盖底层内存,因此私钥位等敏感信息不会保留在内存中。如果您确实需要将secure_vector 转换为法线向量,则可以使用便捷函数Botan::unlock (https://github.com/randombit/botan/blob/master/src/lib/base/secmem.h)。

【讨论】: