c# 对XML进行数字签名并且让java验签成功

实现:

1.c#将xml报文做数字签名发送到java服务,java服务成功验签。

2.c#服务对收到java服务推送的xml报文成功验签。

前提:

1.java服务要求


遇到问题:

1.Java和.net 之前 RSA 私钥秘钥格式问题。

2.framework4.0 SignatureDescription could not be created for the signature algorithm supplied.  

无法为所提供的签名算法创建SignatureDescription。——资料6 第二个链接,关键在:在全局文件中,对加密配置(CryptoConfig)添加算法 RsaPkcs1Sha256SignatureDescription

3.

 


 

资料:

1.msdn:xml签名:https://docs.microsoft.com/zh-cn/dotnet/standard/security/how-to-sign-xml-documents-with-digital-signatures

2.msdn:xml验签:https://docs.microsoft.com/zh-cn/dotnet/standard/security/how-to-verify-the-digital-signatures-of-xml-documents

3.csdn讨论帖:https://bbs.csdn.net/topics/392005202

4.C#下解析、生成JAVA的RSA密钥、公钥:https://blog.csdn.net/starfd/article/details/51838589

5.微软对xml加签验签的举例:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.xml.signedxml?view=netframework-4.7.2

6.stack overflow对xml sha256签名的讨论帖:

    1). https://stackoverflow.com/questions/17258800/c-sharp-support-for-rsa-sha-256-signing-for-individual-xml-elements

    2). http://www.voidcn.com/article/p-ezohxnnk-bty.html

 

转载于:https://www.cnblogs.com/heweiquan123/p/10163703.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C#加签Java验签SM2的示例代码: C#加签示例代码: ```csharp using System; using System.Security.Cryptography; using System.Text; namespace SM2Demo { class Program { static void Main(string[] args) { // 待签名的数据 string data = "Hello World!"; // 加载SM2证书 CngKey key = CngKey.Open("SM2Test"); // 创建SM2签名对象 ECDsaCng sm2 = new ECDsaCng(key); // 计算签名 byte[] signature = sm2.SignData(Encoding.UTF8.GetBytes(data)); // 输出签名结果 Console.WriteLine("Signature: " + Convert.ToBase64String(signature)); } } } ``` Java验签示例代码: ```java import java.security.*; import java.security.spec.ECGenParameterSpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; public class SM2Demo { public static void main(String[] args) throws Exception { // 待验签的数据 String data = "Hello World!"; // 加载SM2证书 KeyFactory keyFactory = KeyFactory.getInstance("EC"); byte[] privateKeyBytes = Base64.getDecoder().decode("MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgJzvJZJZJ5zJzJZJ5\n" + "zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ\n" + "5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ\n" + "5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJw=="); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes); PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); byte[] publicKeyBytes = Base64.getDecoder().decode("MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DfQADZGk+JzJZJ5zJzJZJ5zJzJZJ5zJzJ\n" + "ZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJ\n" + "ZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJ\n" + "ZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJw=="); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); // 创建SM2验签对象 Signature signature = Signature.getInstance("SM3withSM2"); signature.initVerify(publicKey); // 验证签名 byte[] signatureBytes = Base64.getDecoder().decode("MEUCIQDQJzvJZJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJgIgQJzvJZJZJ5zJz\n" + "JZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJz\n" + "JZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJzJZJ5zJw=="); signature.update(data.getBytes()); boolean result = signature.verify(signatureBytes); // 输出验签结果 System.out.println("Verify result: " + result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值