远程提取(r,s)和验证ECDSA签名

时间:2018-04-23 06:09:48

标签: java node.js cryptography ecdsa

我正在尝试使用Java客户端签名内容,然后在服务器(nodejs)上验证相同内容。我的客户端签名函数使用ECDSA并返回byte[]。我可以访问服务器上包含x的{​​{1}}和y坐标值。

publicKey

是否可以找到构成签名的public static byte[] sign(String plainText, PrivateKey privateKey) throws Exception { java.security.Signature dsa = java.security.Signature.getInstance("SHA1withECDSA"); dsa.initSign(privateKey); dsa.update(plainText.getBytes(UTF_8)); return dsa.sign(); } r值?如何将从上方获得的s转换为byte[]对或(r,s)作为十六进制?在DER-encoded signature服务器端,我使用elliptic进行签名验证。

修改

感谢Dave的评论,我正在使用methods indicated in this SO answer

node

了解public static BigInteger extractR(byte[] signature) throws Exception { int startR = (signature[1] & 0x80) != 0 ? 3 : 2; int lengthR = signature[startR + 1]; return new BigInteger(Arrays.copyOfRange(signature, startR + 2, startR + 2 + lengthR)); } public static BigInteger extractS(byte[] signature) throws Exception { int startR = (signature[1] & 0x80) != 0 ? 3 : 2; int lengthR = signature[startR + 1]; int startS = startR + 2 + lengthR; int lengthS = signature[startS + 1]; return new BigInteger(Arrays.copyOfRange(signature, startS + 2, startS + 2 + lengthS)); } xyr值,我正在尝试验证节点服务器上的消息s

this is a test string

要使用Message : this is a test string Curve Parameters: secp256k1 Public Key: X : 52552626316292256179275635993655485173638967401615704770864787021340356427096 Y : 115577290317206876914379725139810202736866562857077399175416156471449711434272 Signature details: R : [0, -63, -80, -50, -87, -56, 93, 19, 82, 46, 51, 14, -75, 103, 115, 126, 21, 94, 43, 102, -21, -86, -29, -5, 25, 14, -6, -116, 120, -54, -66, 2, -78] S : [0, -40, -119, 77, -14, 113, -105, -117, 93, 70, -107, -3, 63, 12, 77, -48, 59, -47, -7, -126, -60, -109, 95, -6, -66, -120, -8, -103, 122, 40, 24, -31, 89] 模块进行验证,我有以下

elliptic

var EC_Instance = new EC(); var signature = { r : new Buffer([0, -63, ..., 2, -78]), s : new Buffer([0, -40, ..., -31, 89]) }; var x = "52552626316292256179275635993655485173638967401615704770864787021340356427096"; var y = "115577290317206876914379725139810202736866562857077399175416156471449711434272"; EC_Instance.importPublicKey(x, y); // calls ec.keyFromPublic(pub, 'hex') var verification_true = EC_Instance.verify("this is a test string", signature); 是该类的一个对象,包含以下内容:

EC_Instance

1 个答案:

答案 0 :(得分:0)

这可能是哈希函数。不应再使用SHA-1进行签名操作。

我认为对于使用SHA-256哈希方法的node.js代码,虽然几乎不可能用当前文档验证这一点(甚至几乎没有提到哈希)。

请注意 - 使用任何签名 - 哈希是配置参数;它应该(并且对于EC它不能,至少没有实际验证)从签名本身确定。