当前位置: 首页 > 知识库问答 >
问题:

SHA256 with ECDSA签名算法的输出格式是什么?

邵昆琦
2023-03-14

我正在使用secp256k1曲线生成一个密钥对。然后我使用私钥签署一个随机字符串:

byte[] content = "random string".getBytes();
Signature dsa = Signature.getInstance("SHA256withECDSA");
dsa.initSign(privateKey);
dsa.update(content);
byte[] signature = dsa.sign();

签名字节数组具有以下内容:

[48, 68, 2, 32, 11, 25, 119, -64, -107, 53, -84, 65, -18, -81, -56, 34,
11, 29, 120, 38, -102, 105, -89, -9, -46, -28, 91, 59, -74, -103, -53,
117, 81, -37, 85, 27, 2, 32, 55, 97, -11, -85, 110, -106, 81, -94, 7,
112, 125, -29, -16, -8, 121, 123, 14, -17, -7, -10, 1, -80, -117, 86,
98, -13, -47, -51, 58, -15, -48, 10]

我想了解签名数组的内容是什么。根据ECDSA Wikipedia页面,签名是计算的值(r,s ),但在我看来,数组中有更多的值。签名总是以字节开始

48, 68, 2, 32

这似乎是某种报头。是否有说明该数组格式的规范?具体来说,我想获得r和s值。

谢谢。

共有1个答案

晏望
2023-03-14

我很确定这是个骗局,但我现在没时间看。

ECDSA(或DSA)签名有几种标准表示/编码。JavaJCE使用的是ASN。1阶编码——参见维基百科了解基本知识和详细信息。具体而言,ECDSA或DSA签名是ASN。1两个整数字段的序列;请参见rfc3279第2.2.3节中的ECDSA Sig值,或第114页第1节附录C.5的一部分或第X9.62页,但这需要费用。

字节48(0x30)是SEQUENCE的标签(实际上0x10 SEQUEM加上“构造”的0x20),后面跟着一个或多个字节,给出序列主体的长度;对于 EC,主体几乎总是足够短,可以使用简单的一字节长度。2 是 INTEGER 的标记,后跟一个字节,给出第一个整数的长度。在该整数的值(又名内容)结束之后,将有另一个2,这是第二个整数的标签,后跟一个字节,这是第二个整数的长度。secp256k1 的整数通常具有 32 或 33 个八位字节的长度,具体取决于它们是否需要填充以确保符号为正数,因为 ASN.1 整数是有符号的,在 DER 中它们是 2 的补码,但在极少数情况下,它们的数量较少。

 类似资料:
  • 问题内容: 我第一次在方法签名中看到它。 我试图访问一个.class文件。它具有如下定义的方法 那个GraphData就是带有getter和setter的POJO。为什么显示.class文件而不是显示? 问题答案: 它是 varargs ,只能在参数列表中最后使用。最后一个参数可以容纳多个对象。 查看“ a”和“ b”如何转换为数组。

  • 签名算法描述如下: 1.将请求参数按参数名升序排序; 2.按请求参数名及参数值相互连接组成一个字符串:...; 3.将应用密钥分别添加到以上请求参数串的头部和尾部:<请求参数字符串>; 4.对该字符串进行MD5(全部大写),MD5后的字符串即是这些请求参数对应的签名; 5.该签名值使用sign参数一起和其它请求参数一起发送给服务开放平台。 参数示例 { "name": "file.uplo

  • 签名作用 问题 如何分辨出是否贵企业的请求? 如何分辨出请求消息的内容是否被篡改? 解决方法 通过数字签名就可以解决上述的问题。具体为:约定sign_key作为密钥,该sign_key仅贵企业和滴滴知道,在传输中不可见,用于参与签名计算。 企业在发送请求前,将消息内容与sign_key按照滴滴提供的签名算法计算出签名。滴滴在收到请求时,也按相同算法计算出签名。 如果为同一签名,则可信任来源为贵企业

  • 算法描述 生成签名的时候,将颁发的sign_key加入到传递的参数中,参与加密 传递的参数(包含sign_key)按照参数名升序排序,然后,以&形式连接(类似格式为a=xxx&b=xxx&c=xxx...),生成小写的md5串 生成sign后,sign和其他参数一起传递,对于中文在传递的过程中,需要进行urlencode,加密的时候不进行urlencode(如是以POST方法json格式传参不需要

  • 我们可以看到格式化就是通过格式字符串得到特定格式: format!("{}", foo) -> "3735928559" format!("0x{:X}", foo) -> "0xDEADBEEF" format!("0o{:o}", foo) -> "0o33653337357" 根据使用的参数类型,同样的变量(foo)能够格式化成不同的形式:X, o 和未指定形式。 这个格式化的功能是通过 t

  • >美国东部时间2014年11月12日06:53:47