在 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
我正在尝试调试我自己的 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