怎样用Java来验证用CryptoAPI的CryptSignHash方法产生的PKCS1格式的签名

sword93 2010-06-27 04:01:14
如题,我用VC 调用CryptoAPI的CryptSignHash方法产生了一个签名值,将其进行Base64编码交给给Java程序,由Java来进行验证!但是我的验证始终不成功!
...全文
451 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
愤怒的熊猫007 2012-02-27
  • 打赏
  • 举报
回复
在java验签时将签名数据倒置~我也遇到同样问题,刚才在网上找到的答案,我刚刚实验过可以~呵呵~
pmjsmallworm 2010-11-03
  • 打赏
  • 举报
回复
正好相反,我是由JAVA签名后产生一个PKCS7的签名值,然后用C#来验证JAVA的签名,
我将签名值与公钥信息传到C#端,将公钥信息装入RSA容器,去验证,死活验不出来...
C#好像只提供了PKCS1的签名与验签.并不能选择.
所以只好将PKCS7转换为PKCS1或者,在JAVA签名时就填充为PKCS1 在网上找了半天
也没找到一个具体的解决办法.
  • 打赏
  • 举报
回复
你这样问,大家很难帮你解答。

你把 base64 后的公钥字符串、原始数据和 base64 的签名值贴一下吧,这样大家还能进行测试。
dracularking 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sword93 的回复:]

我google找到了https://www.infosecurity.org.cn/forum/read.php?fid=11&tid=683&page=2&fpage=41 其中14楼的哥们提到的Little-Endian,Big-Endian可能是解决问题的关键,由于我这儿要求只能修改Java程序,所以,我试着将签名结果在java程序中转换为Big-Endian,但验……
[/Quote]
用base64编解码前后是不是一致可以查验的吧
dracularking 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sword93 的回复:]
将签名好的二进制数据pbSignature进行Base64编码后,传给Java程序,其验证代码已经在上面已经给出!至于产生密钥对的算法我觉得与本问题没有关系!只要保证签名算法与验签算法一至就行!
[/Quote]
是啊,这个一致不就是关系吗,我开始是怀疑不一致才问的

这段程序给出的没用,细节都没的,签名产生的算法是什么看不出,看如果是PKCS#1,是和SHA1withRSA有关的
sword93 2010-06-28
  • 打赏
  • 举报
回复
我google找到了https://www.infosecurity.org.cn/forum/read.php?fid=11&tid=683&page=2&fpage=41 其中14楼的哥们提到的Little-Endian,Big-Endian可能是解决问题的关键,由于我这儿要求只能修改Java程序,所以,我试着将签名结果在java程序中转换为Big-Endian,但验证依然失败,或许是我的转换有问题,我的转换过程如下:在java程序中,先对签名值进行base64解码得到一个byte[]数组,将数组中的值时行转换,最后得到一个新的数组,再将这个数组作验证的数据进行验证,遗憾的是仍然失败。。。
sword93 2010-06-28
  • 打赏
  • 举报
回复
C++签名代码:
DWORD SignUsrData(
PCCERT_CONTEXT pcCertContext,//入参
BYTE *pbData, //入参
DWORD dwDataLen,//入参
BYTE *pbSignature,//出参
DWORD *pdwSignLen//出参
)
{
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hHash = NULL;
DWORD dwRet,dwKeySpec;
BOOL bShouldIFreeProv;

if ( !CryptAcquireCertificatePrivateKey(pcCertContext,CRYPT_ACQUIRE_COMPARE_KEY_FLAG,
NULL,&hCryptProv,&dwKeySpec,&bShouldIFreeProv) || hCryptProv == NULL )
{
goto ERR;
}

if(!CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash))
{
goto ERR;
}

if(!CryptHashData(hHash, pbData, dwDataLen, 0))
{
goto ERR;
}

if(!CryptSignHash(hHash, dwKeySpec, NULL, 0, pbSignature, pdwSignLen))
{
goto ERR;
}
CryptDestroyHash(hHash);
if ( bShouldIFreeProv )
CryptReleaseContext(hCryptProv, 0);

return 0;

ERR:
dwRet = GetLastError();
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv&&bShouldIFreeProv)
CryptReleaseContext(hCryptProv, 0);
SetLastError(dwRet);
return dwRet;
}

将签名好的二进制数据pbSignature进行Base64编码后,传给Java程序,其验证代码已经在上面已经给出!至于产生密钥对的算法我觉得与本问题没有关系!只要保证签名算法与验签算法一至就行!

dracularking 2010-06-28
  • 打赏
  • 举报
回复
你这个问题可以抽象出来这块功能段让大家完整测试的,就给出的这些看不出什么问题,不出意外的话,一试就出来了,一些初始信息,包括使用算法
sword93 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huntor 的回复:]
PKCS#1

Java code
Signature signer = Signature.getInstance("SHA1withRSA");
[/Quote]

签名算法用的是MD5withRSA
dracularking 2010-06-27
  • 打赏
  • 举报
回复
产生公钥私钥的加密算法都是什么
huntor 2010-06-27
  • 打赏
  • 举报
回复
PKCS#1
Signature signer = Signature.getInstance("SHA1withRSA");

sword93 2010-06-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 sword93 的回复:]
如题,我用VC 调用CryptoAPI的CryptSignHash方法产生了一个签名值,将其进行Base64编码交给给Java程序,由Java来进行验证!但是我的验证始终不成功!
[/Quote]
Base64的编解码都没有问题,在用如下代码:
//获取证书公钥部分略...
java.security.Signature si = Signature.getInstance("MD5withRSA");
si.initVerify(pubkey);
si.update(String2ByteArray(sPlainText));
boolean bVerifyRet= si.verify(base64.decode(new String(bSignature)));
bVerifyRet 始终返回False;但是我如果直接用si.sign()来签名数据,验证是没有问题的!
  • 打赏
  • 举报
回复
有啥错误信息呢?是由于签名值,还是你对Base64的验证就有问题?

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧