在 ECDSA 中拥有随机数(不是私钥)

Own random (not the private key) in the ECDSA

我正在尝试调试我自己的 ECDSA 签名实现。为了比较中间结果,我想强制 OpenSSL、Crypto++ 或任何其他包使用已知的 "random" 数字,而不是在每次创建签名时都生成它。有办法吗?

由于我使用的是 brainpool 曲线,因此我无法使用 Microsoft 加密 API。这不支持 Crypto API 中的脑池曲线,直到 Windows 10.

另一种方法是从一个流行的包中检索 ECDSA 签名创建后使用的随机数。

感谢任何帮助

是的,这可以通过 OpenSSL 实现。 OpenSSL 提供了覆盖默认随机数源的能力。为此,请使用此处记录的 RAND_set_rand_method() 函数:

https://www.openssl.org/docs/man1.1.0/crypto/RAND_set_rand_method.html

此函数将 RAND_METHOD 结构作为参数,该结构包含指向 OpenSSL 随机功能实现的函数指针。用您自己的实现替换 bytes 元素。

例如

RAND_METHOD myrand, *oldrand;

oldrand = RAND_get_rand_method();
myrand = *oldrand;
myrand.bytes = mybytes;
RAND_set_rand_method(myrand);

其中mybytes定义如下:

static int mybytes(unsigned char *buf, int num)
{
    /* Replace with however you want the random function to work */
    memset(buf, 0, num);
    return 1;
}

OpenSSL 自己的 ecdsatest 代码正是这样做的。例如见:

https://github.com/openssl/openssl/blob/OpenSSL_1_1_0-stable/test/ecdsatest.c#L65