我正在处理一个以十六进制格式获取字符串的现有系统,添加8个尾随0,并使用gcrypt对其进行签名。我正在尝试制作可以验证签名的Android版本。现有系统有效,无法更改。我不能,尽管头疼很多,但是让android版本工作。
两端都同意正在签名的数据的值,生成的签名的字节以及正在使用的密钥。我怀疑错误在于对正在签名的数据的解释,我真的不明白。
让我们说我正在签署"A5DA123456789B00000000"
在C ++中,linux端做到了这一点:
#define FORMAT "(data\n (flags pkcs1)\n (hash sha1 #%s#))\n"
sprintf(blob, FORMAT, "A5DA123456789B00000000");
gcry_sexp_sscan(&keydata, NULL, blob, strlen(blob));
然后将keydata作为第二个参数传递给gcry_pk_sign
。
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(pubkey);
BigInteger bigData = new BigInteger("A5DA123456789B00000000", 16);
sig.update(bigData.toByteArray());
boolean pass = sig.verify();
传递将是假的。
我可以用Java签名,Java说签名很好。 我们在linux中有C代码,说gcrypt签名很好。 是否有一些涉及pkcs1的模糊设置,我错过了某个地方?或者显而易见的事我错过了什么?有人知道吗?
提前致谢!
答案 0 :(得分:0)
好的,感谢kroot关于gcrypt行为的重要线索。
对于那些随机发现这个问题的人,我遇到的问题是代码是以奇怪的方式签署数据......并且Java中的任何签名模式都不支持。解决方案是使用Cipher对象。签名只不过是私钥加密的哈希。要验证它,请使用相应的公钥解密签名,并将结果与正在签名的数据的哈希值进行比较。