编程语言
首页 > 编程语言> > 在充气城堡上验证javacard签名ALG_ECDSA_SHA

在充气城堡上验证javacard签名ALG_ECDSA_SHA

作者:互联网

我的问题看起来像这样:我在javaCard上生成一个签名(jcdk 2.2.2),当我想在终端上使用BouncyCastle验证它时,签名并不总是被验证 – 3,66中的1(平均100次尝试)签名是经核实,其余部分归还假.当我验证卡上的签名时,它总是返回true,但是在终端上它通常返回false,但有时是真的.因为终端有时给出一个肯定的答案我认为代码是好的,原因是其他地方,但我可能是错的.

在javacard im usign Signature.ALG_ECDSA_SHA,并在终端Signature.getInstance(“SHA1withECDSA”,“BC”)上我尝试了SHA1withDetECDSA,但我的行为相似.

请帮忙.

解决方法:

问题是JavaCard和BouncyCastle使用不同格式的结果签名.例如,对于Prime192v1曲线,生成的JavaCard签名总是56个字节长,但Bouncy Castle签名有时更短,因为它省略了EC点坐标中的前导零.

JavaCard签名(对于Prime192v1,再次)看起来像十六进制格式:

30 36 02 19 [第一个coord的25个字节] 02 19 [第二个coord的25个字节]

(它是DER编码结构:两个INTEGER的SEQUENCE)

但是,BouncyCastle并不期望在EC坐标中引领这些零.因此,您必须删除它们并修复DER结构

30 36 02 19 **00 00** [the rest 23 bytes of the first coord] 02 19 **00** [24 bytes of the second coord]

必须将来自JavaCard的Bouncy Castle转换为:

30 ** 33 ** 02 ** 17 ** [第一个coord的23个字节] 02 ** 18 ** [第二个coord的24个字节]

您有时正确验证签名的原因很简单:有时您的JavaCard签名坐标中没有前导零.

编辑:灵感来自TajnosAgentos的观察:

BouncyCastle将coords编码为有符号整数,JavaCard始终为无符号整数.这就是为什么只要第一个字节的最高位为1,BouncyCastle就会添加一个特殊的前导零(尽管它会修剪其他前导零),因为coord总是一个正数.

标签:java,cryptography,digital-signature,bouncycastle,javacard
来源: https://codeday.me/bug/20190824/1711366.html