qq_36879201 2023-06-08 11:25 采纳率: 0%
浏览 29

生成的数字签名DER格式错误

Java调用CMSSignedDataGenerator生成的数字签名DER格式错误,以下3个地方均出错(长度字节不应该为80):

img

Java代码为:

 try {
            //获取私钥
            FileReader keyReader = new FileReader(keyPath);
            PEMParser pemParser = new PEMParser(keyReader);
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
            PrivateKeyInfo privateKeyInfo = PrivateKeyInfo.getInstance(pemParser.readObject());
            PrivateKey prikey = converter.getPrivateKey(privateKeyInfo);

            //获取证书
            CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509", "BC");
            InputStream bais = new FileInputStream(certPath);
            X509Certificate cerx509 = (X509Certificate) certificatefactory.generateCertificate(bais);

            //添加Certificates
            CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
            List certList = new ArrayList();
            certList.add(cerx509);
            Store certs = new JcaCertStore(certList);
            gen.addCertificates(certs);

            //添加SignerInfo
            ContentSigner sha1Signer = new JcaContentSignerBuilder("SM3withSM2").setProvider("BC").build(prikey);
            gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, cerx509));

            //生成SignedData
            CMSTypedData msg = (CMSTypedData) new CMSProcessableByteArray(srcMsg.getBytes(charSet));
            CMSSignedData sigData = gen.generate(msg, true);

            return sigData.getEncoded();


        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-12 13:30
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      由于没有具体的代码和错误信息,我将给出一般性的解决方案:

      1. 确认生成数字签名的算法和密钥是否正确。可以尝试使用其他算法或密钥进行生成,看是否能够得到正确的DER格式。

      2. 确认生成数字签名的消息的编码格式是否正确,比如UTF-8或者ISO-8859-1等。可以尝试修改消息的编码格式来查看是否能够得到正确的DER格式。

      3. 确认生成数字签名时使用的证书是否正确。可以检查证书的有效期、颁发机构等信息,或者尝试使用其他证书来生成数字签名。

      4. 确认生成数字签名时使用的数据是否正确。可以检查数据的完整性、格式等信息,或者尝试使用其他数据来生成数字签名。

      5. 可以使用Java提供的DER编解码工具来检查生成的DER格式是否正确。具体的代码可以参考下面的示例:

      import java.io.IOException;
      import java.nio.file.Files;
      import java.nio.file.Paths;
      
      import sun.security.util.DerInputStream;
      import sun.security.util.DerValue;
      
      public class DerDecoder {
      
          public static void main(String[] args) throws IOException {
      
              // 读取DER格式的数据
              byte[] derBytes = Files.readAllBytes(Paths.get("path/to/der/file"));
      
              // 解码DER格式的数据
              DerInputStream derInputStream = new DerInputStream(derBytes);
              DerValue derValue = derInputStream.getDerValue();
      
              // 打印解码后的数据
              System.out.println(derValue);
          }
      }
      

      希望这些信息能够帮助到你,如果你有具体的问题或者提供具体的代码和错误信息,可以重新提出问题,以便得到更准确的回答。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 6月8日