我正在使用一些第三方存储库(Private Join and Compute)实现一些协议,并且该存储库在创建 EC 组时仅支持 openssl 中 FIPS 模块(P-224、256、348 和 512)中的内置曲线:
StatusOr<ECGroup::ECGroupPtr> CreateGroup(int curve_id) {
auto ec_group_ptr = EC_GROUP_new_by_curve_name(curve_id);
// If this fails, this is usually due to an invalid curve id.
if (ec_group_ptr == nullptr) {
return InvalidArgumentError(
absl::StrCat("ECGroup::CreateGroup() - Could not create group. ",
OpenSSLErrorString()));
}
return ECGroup::ECGroupPtr(ec_group_ptr);
}
(
EC_GROUP_new_by_curve_name
位于openssl/crypto/fips模块中)
我的问题:
我可以修改代码以将我的协议的内置曲线替换为 X25519 吗?我的协议将其用于 ECDH。
当然可以。然而,这不仅仅是改变参数的问题。 X25519的计算和编码也不同。
如果没有,除了 X25519 未经过 FIPS 验证之外,还有什么问题?
FIPS 验证特定于实现,因此说算法未经“FIPS 认证”是没有意义的。当然,FIPS 实现只有使用 NIST 标准化算法才能得到验证,而 X25519 不是其中之一。 NIST 一直在寻找量子安全算法。有一些暗示表明 X25519 可能包含在 NIST SP800-56A 中,但这尚未实现。
或者,简单地说,在什么用例中我应该使用 secp256r1/k1,而 X25519 又应该使用什么?
两者都有大约 128 位的安全裕度,但创建 X25519 的安全实现更容易,例如关于公钥验证和侧信道攻击。 X25519的性能也比较好。 X25519 在我的系统上运行速度似乎快了 50%,不过 - 说实话 -
openssl speed ecdh
命令到处都是。