- 此问题在此处已有答案**:
How should I use crypto:sign/4 properly?(1个答案)
7天前关闭。
我尝试实现了VAPID声明,它使用ECDH签名和prime256v1曲线。
下面是代码:
test() ->
Msg = <<"test">>,
{PubKey, PrivKey} = crypto:generate_key(ecdh, prime256v1),
?LOG(notice,"PubKey:~p~n",[PubKey]),
?LOG(notice," PrivKey:~p~n",[PrivKey]),
Signature = crypto:sign(ecdsa,sha256,Msg,PrivKey),
?LOG(notice,"~p~n",[Signature]).
当我运行它时,我得到错误消息:
** exception error: {badarg,{"pkey.c",363},"Couldn't get ECDSA private key"}
in function crypto:sign/5 (crypto.erl, line 1455)
*** argument 4: Couldn't get ECDSA private key
*** (Found in the internal file pkey.c at line 363)
你知道怎么修吗?
2条答案
按热度按时间hgc7kmma1#
在enter link description here中找到解决方案
应该是
brvekthn2#
没有所谓的“ECDH签名”。ECDH是一种密钥协商(有时称为密钥交换)算法。ECDSA是一种签名算法。
ECDH和ECDSA使用相同的数学对象1作为密钥,但如果您告诉加密库某个密钥是用于某个算法的,它通常会阻止您将该密钥用于另一个算法(因为这可能是一个打开安全漏洞的错误)。我不熟悉Erlang,也不知道它的加密库是否实现了这种检查,但如果实现了,那是一件好事。
VAPID使用ECDSA签名。
因此,将代码更改为
1Weierstrass椭圆曲线上的密钥对。根据您使用的术语,ECDH还可能包含与蒙哥马利曲线上的密钥对非常相似的密钥交换算法,但未定义ECDSA。