java实现对数字签名的验证与C#的区别

ligongda840422 2015-09-17 11:29:23
对方给我了原始数据、公钥、数字签名。但是我用java的验证的方法没有通过以下是我的方法:
/** *//**
* <p>
* 校验数字签名
* </p>
*
* @param data 已加密数据
* @param publicKey 公钥(BASE64编码)
* @param sign 数字签名
*
* @return
* @throws Exception
*
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
byte[] keyBytes = Base64Utils.decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicK = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicK);
signature.update(data);
return signature.verify(Base64Utils.decode(sign));
}

以下是对方c#的验证方法,我总觉得他的验证跟我的这个不是一个事,求大神解释一下 他的方法是数字签名的验证吗,为什么给我的数据验证不通过。
c# 方法:
...全文
334 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ligongda840422 2015-09-17
  • 打赏
  • 举报
回复
我用这个方法验证通过了。 但是我看着跟第一个没啥区别呀 /** * 签名算法 */ public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; private static final String KEY_ALGORTHM = null; public static boolean doCheck(String content, String sign, String publicKey) { try { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); byte[] encodedKey = Base64Utils.decode(publicKey); PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS); signature.initVerify(pubKey); signature.update( content.getBytes() ); boolean bverify = signature.verify( Base64Utils.decode(sign) ); return bverify; } catch (Exception e) { e.printStackTrace(); } return false; }
ligongda840422 2015-09-17
  • 打赏
  • 举报
回复
就别管他的了 你帮我看看 他给的例子 用java验证对不对
whos2002110 2015-09-17
  • 打赏
  • 举报
回复
C#不懂啊, 不过他方法都没有用到pk参数这点就不靠谱吧
ligongda840422 2015-09-17
  • 打赏
  • 举报
回复
例子是这样的 原始数据(501位后面有空格):4202201410270211123711980035 A 2014122220150625104930 0 1 035 1 12 2 FRIENDLY SEAS FRIS010 1500000.00 1500000.00 410 4202371198003542002610 签名:Cwbq9L84vth27oK317xyuKnXo/3vi02xJBqHi/VsiryOuCUsUEB3+g6+WNQFfTmY0pmgggXSRIh99KHMy2heGEJPgRwLL1GwxtUrnMfN1LXinDWQyN43TL0qCDdZSP3BawSXJGD7c1OhN8PUEp7DU9eOl0jck75pT+ktmSPabzw= 公钥:给我的是C#格式的 <RSAKeyValue> <Modulus>vhx1ZLeh9yEuVv2/+I7upOqLDhK7PqOI1zZyfHUyqNe5k9q1lNe+u9Fmw80gC88giKf5+ppgydFX8nWVI/nRne3jcf17uReb0asYyPTHjg0O7kD7pqVVK2AAUhsNd2zEs19103425/Xuh1ADhc7BFU/D3dL9GZmEInZp0scnck8=</Modulus> <Exponent>AQAB</Exponent> </RSAKeyValue> 我转换成java需要的字符串格式: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+HHVkt6H3IS5W/b/4ju6k6osOErs+o4jXNnJ8dTKo17mT2rWU17670WbDzSALzyCIp/n6mmDJ0VfydZUj+dGd7eNx/Xu5F5vRqxjI9MeODQ7uQPumpVUrYABSGw13bMSzX3XTfjbn9e6HUAOFzsEVT8Pd0v0ZmYQidmnSxydyTwIDAQAB 帮我验证一下 我的方法对不对。还是他给我的数据有问题。
ligongda840422 2015-09-17
  • 打赏
  • 举报
回复
我只想知道 我的这个验证方法是不是就是他的验证方法。 因为我的这个方法我试验过 是没有问题的。如果这两个就是一种验证的话。 会不会就是 给我的数据有问题了。我本身的方法没问题。
whos2002110 2015-09-17
  • 打赏
  • 举报
回复
密钥和算法分别是: RSA 和 SHA1withRSA 这个没问题吧? 如果验证不通过, 只需要看是如何加密的,密钥类型,签名算法,有没有加盐啊这些, 跟c#的解密做对比没用啊。

50,729

社区成员

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

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