Hash 在erlang中将数据块签名为哈希不起作用。基于电子商务的密钥推导

Hash 在erlang中将数据块签名为哈希不起作用。基于电子商务的密钥推导,hash,cryptography,erlang,sign,elliptic-curve,Hash,Cryptography,Erlang,Sign,Elliptic Curve,Erlang版本:9.2 我正在尝试在ecdh base上使用生成的密钥对一个数据块进行签名 以下是我的工作流程: 86> {PublicKey, PrivKeyOut} = crypto:generate_key(ecdh, crypto:ec_curve(secp521r1)). {<<4,0,196,6,85,178,189,234,231,13,82,152,96,162,92,163, 133,81,42,147,168,146,138,226,15,80,12

Erlang版本:9.2

我正在尝试在ecdh base上使用生成的密钥对一个数据块进行签名

以下是我的工作流程:

86> {PublicKey, PrivKeyOut} = crypto:generate_key(ecdh, crypto:ec_curve(secp521r1)).
{<<4,0,196,6,85,178,189,234,231,13,82,152,96,162,92,163,
   133,81,42,147,168,146,138,226,15,80,127,228,...>>,
 <<1,33,215,135,89,40,35,40,104,14,217,153,78,62,53,83,
   198,165,84,30,135,159,218,82,47,102,204,...>>}
87> Mesage = "testmessage".
"testmessage"
88> Hash = crypto:hash(sha512, Mesage).
<<1,216,98,78,245,111,176,233,114,224,249,27,118,114,49,
  189,40,144,90,249,175,108,79,235,186,247,247,40,131,...>>
89> Signature = crypto:sign(ecdsa, sha512, Hash, PrivKeyOut).
** exception error: bad argument
     in function  crypto:pkey_sign_nif/5
        called as crypto:pkey_sign_nif(ecdsa,sha512,
                                       <<1,216,98,78,245,111,176,233,114,224,
                                         249,27,118,114,49,189,40,144,90,249,
                                         175,108,79,235,186,247,...>>,
                                       <<1,33,215,135,89,40,35,40,104,14,217,
                                         153,78,62,53,83,198,165,84,30,135,159,
                                         218,82,47,...>>,
                                       [])
     in call from crypto:sign/5 (crypto.erl, line 433)
86>{PublicKey,PrivKeyOut}=crypto:generate_key(ecdh,crypto:ec_曲线(secp521r1))。
{,
}
87>Mesage=“testmessage”。
“测试消息”
88>Hash=crypto:Hash(sha512,Mesage)。
89>签名=加密:签名(ecdsa、sha512、哈希、私钥输出)。
**异常错误:参数错误
函数内加密:pkey\u sign\u nif/5
称为加密:pkey_sign_nif(ecdsa,sha512,
,
,
[])
来自crypto的呼叫中:sign/5(crypto.erl,第433行)

我做错了什么?

我发现了旧的erlang错误,这些错误表明椭圆曲线密码套件没有完全实现。 此处为URL:

我将使用LibNasdinal库进行测试:


Thx

您的代码有两个问题:

  • crypto:sign/4
    的第四个参数称为
    Key
    ,但如果您检查,它实际上需要一个
    [ecdh_private(),ecdh_params()]
    列表(至少在使用
    ecdsa
    算法的情况下)
  • 如果您自己计算
    散列
    ,则第三个参数应为
    {digest,Hash}
    。否则,您将对消息哈希的哈希进行签名。您也可以将普通消息传递给函数,但在这种情况下,它必须是二进制的,而不是字符串
以下是解决这些问题的方法:

EcdhParams = crypto:ec_curve(secp521r1),
{PublicKey, PrivKeyOut} = crypto:generate_key(ecdh, EcdhParams),
Message = <<"testmessage">>,
crypto:sign(ecdsa, sha512, Message, [PrivKeyOut, EcdhParams]).

生成密钥时,是否可以尝试
ecdsa
插入
ecdh
?虽然参数和键应该是相同的,但可能是API不想将两者结合起来。还要注意,ECDSA需要消息本身作为输入:散列是在内部执行的。当前您正在对输入消息进行双重哈希。这是我的终端上的结果:{PublicKey,PrivKeyOut}=crypto:generate_key(ecdsa,crypto:ec_curve(secp521r1)).*异常错误:没有与crypto:generate_key(ecdsa{{prime_字段,好的,对,如果您事先不执行散列,即将
Mesage
而不是
Hash
输入
crypto:sign
,该怎么办?似乎该参数的类型应该是
binary()
,但你永远不会知道。thx为你提供帮助:以下是我的结果:Signature=crypto:sign(ecdsa,sha512,Mesage,PrivKeyOut)。**异常错误:函数crypto:pkey\u sign\u nif/5中的参数错误,称为crypto:pkey\u sign\u nif(ecdsa,sha512,“testmessage”,)在crypto:sign/5(crypto.erl,第433行)Hmm的调用中,
digest.binary()
也应该被接受,所以双哈希可能不是这种情况。我注意到的一点是,API中参数的顺序不清楚,您能否切换
Hash
sha512
?API中参数列表和描述的顺序不同。因为我在调用中没有看到任何其他问题。thx,这是我问题的解决方案,我是erlang的初学者:-)
EcdhParams = crypto:ec_curve(secp521r1),
{PublicKey, PrivKeyOut} = crypto:generate_key(ecdh, EcdhParams),
Message = "testmessage",
Hash = crypto:hash(sha512, Message),
crypto:sign(ecdsa, sha512, {digest, Hash}, [PrivKeyOut, EcdhParams]).