Erlang crypto:sign ecdh prime 256 v1-无法获取ECDSA私钥[重复]

zfciruhq  于 2023-01-03  发布在  Erlang
关注(0)|答案(2)|浏览(239)
    • 此问题在此处已有答案**:

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)

你知道怎么修吗?

hgc7kmma

hgc7kmma1#

enter link description here中找到解决方案
应该是

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,prime256v1]),
 Signature.
brvekthn

brvekthn2#

没有所谓的“ECDH签名”。ECDH是一种密钥协商(有时称为密钥交换)算法。ECDSA是一种签名算法。
ECDH和ECDSA使用相同的数学对象1作为密钥,但如果您告诉加密库某个密钥是用于某个算法的,它通常会阻止您将该密钥用于另一个算法(因为这可能是一个打开安全漏洞的错误)。我不熟悉Erlang,也不知道它的加密库是否实现了这种检查,但如果实现了,那是一件好事。
VAPID使用ECDSA签名。
因此,将代码更改为

{PubKey, PrivKey} = crypto:generate_key(ecdsa, prime256v1),

1Weierstrass椭圆曲线上的密钥对。根据您使用的术语,ECDH还可能包含与蒙哥马利曲线上的密钥对非常相似的密钥交换算法,但未定义ECDSA。

相关问题