社区
Java
帖子详情
怎样用Java来验证用CryptoAPI的CryptSignHash方法产生的PKCS1格式的签名
sword93
2010-06-27 04:01:14
如题,我用VC 调用CryptoAPI的CryptSignHash方法产生了一个签名值,将其进行Base64编码交给给Java程序,由Java来进行验证!但是我的验证始终不成功!
...全文
451
13
打赏
收藏
怎样用Java来验证用CryptoAPI的CryptSignHash方法产生的PKCS1格式的签名
如题,我用VC 调用CryptoAPI的CryptSignHash方法产生了一个签名值,将其进行Base64编码交给给Java程序,由Java来进行验证!但是我的验证始终不成功!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
愤怒的熊猫007
2012-02-27
打赏
举报
回复
在java验签时将签名数据倒置~我也遇到同样问题,刚才在网上找到的答案,我刚刚实验过可以~呵呵~
pmjsmallworm
2010-11-03
打赏
举报
回复
正好相反,我是由JAVA签名后产生一个PKCS7的签名值,然后用C#来验证JAVA的签名,
我将签名值与公钥信息传到C#端,将公钥信息装入RSA容器,去验证,死活验不出来...
C#好像只提供了PKCS1的签名与验签.并不能选择.
所以只好将PKCS7转换为PKCS1或者,在JAVA签名时就填充为PKCS1 在网上找了半天
也没找到一个具体的解决办法.
火龙果被占用了
2010-06-28
打赏
举报
回复
你这样问,大家很难帮你解答。
你把 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()来签名数据,验证是没有问题的!
不姓贾_请叫我甄先生
2010-06-27
打赏
举报
回复
有啥错误信息呢?是由于签名值,还是你对Base64的验证就有问题?
用
java
签名
和用
crypt
oapi
签名
生成的数据的相互
验证
crypt
oapi
的
Crypt
Sign
Hash
方法
签名
生成的数据是pkcs#7
格式
的,
java
中通过bouncycastle的CMS
Sign
edData可以实现pkcs#7
格式
签名
数据的
验证
,利用CMS
Sign
edData
签名
生成pkcs#7
格式
数据。代码如下: /** *//** *
验证
pkcs7
格式
的
签名
数据 * @param
sign
edData pkcs
使用
crypt
o api的
签名
和
验证
签名
源代码
使用
crypt
o api的
签名
和
验证
签名
源代码 #include "stdafx.h" //-------------------------------------------------------------------- // 数字
签名
以及认证 #include #include #include #define MY_ENCODING_TYPE (PKCS_7_ASN_EN
使用Microsoft
Crypt
oAPI
进行加密、解密、
签名
及
验证
(转发)
使用
Crypt
oAPI
编写一个文件保护程序,具有如下功能:(1)给定明文文件,生成加密文件,同时
产生
文件的数字
签名
文件;(2)给定密文文件,解密出明文文件,并
验证
签名
的正确性。 代码:见所附main.cpp 一、 程序概况a) 开发平台:Visual Studio 2005b) 开发语言:C/C++c) 使用密码库:
Crypt
oAPI
二、 主要函数a) 主函数v
Delphi下一代密码学:Windows
Crypt
oAPI
实战指南
本文还有配套的精品资源,点击获取 简介:Windows
Crypt
oAPI
是微软提供的安全服务组件,支持加密、解密、数字
签名
和哈希等操作。该压缩包包含了Delphi环境中使用
Crypt
oAPI
的库和示例代码,帮助开发者实现高级密码学功能。Delphi通过PInvoke技术调用Windows API,具体操作包括获取CSP句柄、生成密钥、数据加密和解密等。内容还可能包括源码库...
Crypt
oAPI
简介(二)
四、
Crypt
oAPI
的应用
Crypt
oAPI
函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。但是,实际上有些应用程序只能与特定的CSP协作。CSP与应用程序之间的关系类似于Windows GDI模型。CSP就类似于图形硬件驱动程序。 密
Java
51,411
社区成员
86,047
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章