我正在尝试调试我自己的ECDSA签名实现。为了比较中间结果,我想强制OpenSSL,Crypto ++或其他任何包使用已知的“随机”数字,而不是每次创建签名时生成它。有办法吗?
由于我正在处理脑池曲线,因此无法使用microsoft crypto API。在Windows 10之前,这不支持加密API中的脑池曲线。
另一种方法可以从一个流行的包中检索创建ECDSA签名后使用的随机数。
我感谢任何帮助
答案 0 :(得分:3)
是的,这可以通过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