Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Javascript 无法使用WebCryptoAPI(SubTecryPto)验证由安全嵌入式芯片生成的原始UInt8Array ECDSA(secp256r1)消息/签名/公钥_Javascript_Arrays_Encryption_Webcrypto Api - Fatal编程技术网

Javascript 无法使用WebCryptoAPI(SubTecryPto)验证由安全嵌入式芯片生成的原始UInt8Array ECDSA(secp256r1)消息/签名/公钥

Javascript 无法使用WebCryptoAPI(SubTecryPto)验证由安全嵌入式芯片生成的原始UInt8Array ECDSA(secp256r1)消息/签名/公钥,javascript,arrays,encryption,webcrypto-api,Javascript,Arrays,Encryption,Webcrypto Api,我正在使用安全嵌入式芯片(ATEC508)使用secp256r1曲线生成ECDSA消息/签名组合 芯片在UINT8阵列中输出的信息:消息[32]、签名[64]和公钥[64]; 公钥是原始字节格式,在64字节数组中提供X/Y坐标,前面没有0x04填充 只有在前面用0x04填充64字节数组时,公钥才会成功导入WebCrypto 但是,当我尝试验证消息和签名时,它总是失败 我创建了一个模拟器脚本来帮助调试。它使用WebCrypto来生成消息、签名和公钥,而不是加密芯片。模拟器生成一个32字节的Uint

我正在使用安全嵌入式芯片(ATEC508)使用secp256r1曲线生成ECDSA消息/签名组合

芯片在UINT8阵列中输出的信息:消息[32]、签名[64]和公钥[64]; 公钥是原始字节格式,在64字节数组中提供X/Y坐标,前面没有0x04填充

只有在前面用0x04填充64字节数组时,公钥才会成功导入WebCrypto

但是,当我尝试验证消息和签名时,它总是失败

我创建了一个模拟器脚本来帮助调试。它使用WebCrypto来生成消息、签名和公钥,而不是加密芯片。模拟器生成一个32字节的Uint8array消息数组,并对返回64字节Uint8array作为其签名的消息进行签名。WebCrypto生成的公钥也经过验证,在代表曲线X/Y坐标的64字节之前,前面有0x04填充。这意味着我相信模拟器生成的信息应该与芯片提供的格式完全相同

从WebCrypto生成的任何消息、签名和公钥都可以成功验证…但我无法验证芯片上的信息…总是不成功

我没有理由怀疑来自芯片的值是错误的,我已经从芯片生成了许多消息/签名…它们都不起作用。我还尝试了第二个芯片,结果也一样

芯片输出示例(未验证):

注意:在导入之前,上面的公钥用0x04填充,否则WebCrypto将抛出错误

WebCrypto模拟器javascript控制台的输出示例(验证OK):

注意:上面是十六进制字符串,但在使用调用WebCryptoAPI之前,我将转换为UintArray8。PublicKey在用于验证之前已转换为正确的CryptoKey()类型

我用于验证的javascript代码:

   let result = await window.crypto.subtle.verify({
            name: "ECDSA",
            hash: { name: "SHA-256" }
        },
        publicKey, sigbuffer, msgbuffer);
最后,进口:

return window.crypto.subtle.importKey(
        'raw',
        key, {
            name: 'ECDSA',
            namedCurve: 'P-256'
        },
        true, ["verify"]
    );

我的目的是能够成功地将芯片中的信息导入并验证到WebCryptoAPI中,但到目前为止我还没有成功。目前,我完全陷入困境,非常感谢您的帮助……如果未删除的数据得到验证,则提前感谢验证发布的数据是成功的(我使用C#解决方案对此进行了测试,请参见在线)。总之,这证明未加密的数据是有签名的

但是,对未签名的数据进行签名并不常见,通常对哈希数据进行签名。一方面,这有纯粹的实际原因(非对称算法通常只能用于加密短消息),但另一方面,出于安全原因,这也是必要的,s。e、 g

由于这个原因,许多库隐式地执行哈希,这就是为什么必须指定摘要。WebCryptoAPI也是如此,导致散列数据通过为未散列数据生成的签名进行验证,这当然会失败

现在也不可能派生其散列仅生成消息的数据,以便将此数据用作WebCryptoAPI的输入。加密散列应该可以防止这种推断

由于这些原因,无法使用WebCryptoAPI验证数据

因此,您需要一个不会隐式散列的JavaScript库,例如:

var pubHex='39C3DD74131729446DC1B3DA67D49FC046FCBF072FC5B9FA51C05B974307F969C403B1635F0449F02BD42751E3321A4434F152F2B2A3F675219C5D925F6';
var pub=new sjcl.ecc.ecdsa.publicKey(
sjcl.ecc.curves.c256,
sjcl.codec.hex.toBits(pubHex)
)
变量msgHex='000102030405060708090A0B0C0D0E0F1011112131415161718191A1B1C1D1E1F';
var msg=sjcl.codec.hex.toBits(msgHex)
var sigHex='D6825CC686F4F849148636E673CD4C0F8E59D7BAD6BB3CF8C38C7774E2A029FF43227DF94156128A1BEA4D578A379C6A850A56BEEC1A69';
var sig=sjcl.codec.hex.toBits(sigHex)
var=false;
试一试{
var验证=发布验证(消息,信号)
}捕获(e){}
console.log('验证:',已验证)
   let result = await window.crypto.subtle.verify({
            name: "ECDSA",
            hash: { name: "SHA-256" }
        },
        publicKey, sigbuffer, msgbuffer);
return window.crypto.subtle.importKey(
        'raw',
        key, {
            name: 'ECDSA',
            namedCurve: 'P-256'
        },
        true, ["verify"]
    );