Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么secp256k1私钥在NodeJ中不总是32字节?_Node.js_Cryptography_Cryptojs_Diffie Hellman - Fatal编程技术网

Node.js 为什么secp256k1私钥在NodeJ中不总是32字节?

Node.js 为什么secp256k1私钥在NodeJ中不总是32字节?,node.js,cryptography,cryptojs,diffie-hellman,Node.js,Cryptography,Cryptojs,Diffie Hellman,当我遇到一个问题时,我使用node的加密模块生成了很多secp256k1密钥,一些生成的私钥的长度并不总是32字节。我写了一个测试脚本,它清楚地表明这种情况经常发生 原因是什么?是否有修复程序,或者我必须检查长度,然后重新生成,直到得到32字节 这是复制问题的测试脚本: const{createECDH,ECDH}=requirecrypto; const privateLens={}; 常量publicLens={}; forlet i=0;i

当我遇到一个问题时,我使用node的加密模块生成了很多secp256k1密钥,一些生成的私钥的长度并不总是32字节。我写了一个测试脚本,它清楚地表明这种情况经常发生

原因是什么?是否有修复程序,或者我必须检查长度,然后重新生成,直到得到32字节

这是复制问题的测试脚本:

const{createECDH,ECDH}=requirecrypto; const privateLens={}; 常量publicLens={}; forlet i=0;i<10000;我++{ const ecdh=createECDHsecp256k1; ecdh.generateKeys; const privateKey=ecdh.getPrivateKeyhex; const publicKey=ecdh.getPublicKeyhex; privateLens[privateKey.length+]=privateLens[privateKey.length+]| | 0+1; publicLens[publicKey.length+]=publicLens[publicKey.length+]| | 0+1; } 独角莲; 控制台。logpublicLens; 多次运行的输出如下所示:

% node test.js
{ '62': 32, '64': 9968 }
{ '130': 10000 }
% node test.js
{ '62': 40, '64': 9960 }
{ '130': 10000 }
% node test.js
{ '62': 39, '64': 9961 }
{ '130': 10000 }
我就是不明白。。。如果我用base64编码,它的长度总是相同的,但将其解码回缓冲区会再次显示一些键的31字节


谢谢,非常感谢您的任何见解

对于EC加密,密钥在字节上不是完全随机的,而是范围内的随机数[1,N,其中N是曲线的顺序。现在,生成的数字通常与256位的顺序大致相同。这一点尤其正确,因为N被故意选择为非常接近2^256,即对于secp256k1,高阶位都设置为1

然而,大约每256个字节中就有一个,所选私钥的第一位仍然全部设置为零。这意味着它需要31个或更少的字节,而不是32个字节。每65536个字节中甚至需要30个字节,而不是32个字节,以此类推。每超过40亿次短规模,它甚至需要29个字节

Base64使用一个字符表示6位(不包括开销)。但是,通常它一次只将3个字节的块编码为4个字符,可能包括使用=个字符填充。这意味着32个字节将占用ceil32/3*4=44个字节。现在,由于ceil31/3*4=44,您不会注意到任何内容。但是,每65536次,您将获得ceil30/3*4=40。在这之后,使用36个字符变得极不可能,尽管从密码学的角度来说,这一数字不小,2^48次中只有一次——我想有些彩票的效果更糟


因此,不必重新生成密钥-对于算法来说,它们毕竟是完全有效的。对于私钥,您通常没有太多的兼容性要求,但是通常您会尝试将这些密钥编码为静态大小32字节,可能在左侧使用00值字节。将它们重新编码为静态大小的密钥可能是错误的一个好主意…

对于EC加密,密钥在字节上不是完全随机的,它是一个范围内的随机数[1,N,其中N是曲线的顺序。现在,生成的数字通常与256位的顺序大致相同。这一点尤其正确,因为N被故意选择为非常接近2^256,即对于secp256k1,高阶位都设置为1

然而,大约每256个字节中就有一个,所选私钥的第一位仍然全部设置为零。这意味着它需要31个或更少的字节,而不是32个字节。每65536个字节中甚至需要30个字节,而不是32个字节,以此类推。每超过40亿次短规模,它甚至需要29个字节

Base64使用一个字符表示6位(不包括开销)。但是,通常它一次只将3个字节的块编码为4个字符,可能包括使用=个字符填充。这意味着32个字节将占用ceil32/3*4=44个字节。现在,由于ceil31/3*4=44,您不会注意到任何内容。但是,每65536次,您将获得ceil30/3*4=40。在这之后,使用36个字符变得极不可能,尽管从密码学的角度来说,这一数字不小,2^48次中只有一次——我想有些彩票的效果更糟


因此,不必重新生成密钥-对于算法来说,它们毕竟是完全有效的。对于私钥,您通常没有太多的兼容性要求,但是通常您会尝试将这些密钥编码为静态大小32字节,可能在左侧使用00值字节。将它们重新编码为静态大小的密钥可能是错误的好主意…

不应该是“其中N是基点的顺序”而不是字段大小吗?是的,调整了,谢谢。否则不会更改答案,幸运的是。不应该是“其中N是基点的顺序”而不是字段大小吗?是的,调整了,谢谢。否则不会更改答案,幸运的是。