您的位置 首页 java

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

rsa 数字签名: rsa( Hash (srcData))->填充pkcs#7格式->存储在 Pdf

SM2数字签名: sm2(hash(srcData))->填充GB/T 38540格式->存储在pdf中

(在RSA体系中,一般来说第一步RSA对原文hash签名就是我们常说的 裸签 ,裸签通过pkcs#7填充后就是我们pdf所需要的签名格式,其中有个pkcs#1概念就是裸签前对原文进行补位操作后再签名)

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

​编辑

电子签名、电子签章已经不是个陌生的东西了。在 java 领域使用itextpdf可以完成pdf的电子签名。当然最终是以pkcs7的格式存储在pdf文件中。类似

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

​编辑

我们知道pkcs7是RSA体系中的,属于国际标准。我们国家的国密标准也早就出台了,那是否能实现国密的数字签名呢?答案是肯定的可以。

方案一、

itextpdf+修改源代码+bouncycastle

 MakeSignature.signDetached(appearance, digest, pks, 
chain, crlList,  ocsp Client, tsaClient, estimatedSize, subfilter);

修改MakeSignature类及相关的几个类,核心就是修改PdfPKCS7类。 bouncycastle 本身就支持
sm2 sm3等国密算法  

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

方案二、

itextpdf+signExternalContainer+bouncycastle

 ExternalSignatureContainer external = 
   new HashExternalSignatureContainer(PdfName. ADOBE _PPKMS, PdfName.ADBE_PKCS7_DETACHED);
        MakeSignature.signExternalContainer(appearance, external, 8192);

itextpdf已经提供signExternalContainer来让用户自定义签名  

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

当然还有个关键问题就是如何把pkcs7换成国密的数据结构,我们知道国密的数据结构是asn.1编码的,当然pkcs7也是 ASN .1编码,只不过两者的数据结构体不一样。在java中可以使用bouncycastle来完成签名后的数据序列化成国密要求的数据结构。

step1

先按照《安全电子签章密码技术规范》国密标准生成java对象

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

​编辑

 @Data
@Builder
public class SES Header   extends  ASN1Object {
    //头标识
     private  DERIA5String id;
    //印章版本号
    private ASN1Integer version;
    //厂商标识
    private DERIA5String vid;


    @Override
    public ASN1Primitive toASN1Primitive() {
        ASN1EncodableVector  vector  = new ASN1EncodableVector();
        vector.add(id);
        vector.add(version);
        vector.add(vid);
        return new DERSequence(vector);
    }
}  

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

step2

创建好对象后,就可以序列化成 byte []

 byte[] encode = signature.toASN1Primitive().getEncoded();  

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

step3

生成16 进制 就可以放置在pdf中了

 Hex.toHexString(paddedSig)  

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

​编辑

文章来源:智云一二三科技

文章标题:Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

文章地址:https://www.zhihuclub.com/186845.shtml

关于作者: 智云科技

热门文章

网站地图