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

时间:2018-05-08 13:35:52

标签: openssl bouncycastle elliptic-curve ecdsa

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

由于我正在处理脑池曲线,因此无法使用microsoft crypto API。在Windows 10之前,这不支持加密API中的脑池曲线。

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

我感谢任何帮助

1 个答案:

答案 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