• ECC有关DER文件的解析(Java)


    ECC有关DER文件的解析(Java)

    本篇博客提供有关ECC的DER文件的Java解析方式,如ECC公钥和ECC签名值对应DER文件的解析,PEM文件也能够使用本博客中提供的解析方式进行解析,PEM文件只是DER文件经过Base64编码之后,加上了头尾说明信息的一类文件而已。

    ECC 公钥DER文件的解析

    1. ECC公钥DER文件的数据结构层次
      在这里插入图片描述
      2 解析
    import org.bouncycastle.asn1.*;
    
    import java.io.ByteArrayInputStream;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.spec.ECGenParameterSpec;
    
    public class DecodeDERECCPubKey {
        public static void main(String[] args) throws Exception {
            Security.addProvider(new BouncyCastleProvider());
            byte[] derByte = getECCPubKey();
            ASN1Primitive asn1 = toAsn1Primitive(derByte);
    
            if(asn1 instanceof ASN1Sequence)
            {
                ASN1Sequence asn1Sequence = (ASN1Sequence) asn1;
                ASN1Encodable[] asn1Encodables = asn1Sequence.toArray();
                for (ASN1Encodable asn1Encodable : asn1Encodables) {
                    ASN1Primitive asn1Primitive = asn1Encodable.toASN1Primitive();
                    if(asn1Primitive instanceof DLSequence)
                    {
                        DLSequence asn1DLSequence = (DLSequence) asn1Primitive;
                        ASN1Encodable[] asn1DLEncodables = asn1DLSequence.toArray();
                        for(ASN1Encodable asn1DLEncodable : asn1DLEncodables)
                        {
                            if(asn1DLEncodable instanceof ASN1ObjectIdentifier)
                            {
                                ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier) asn1DLEncodable;
                                System.out.println(asn1ObjectIdentifier.toString());
                            }
                        }
                    }
                    else if(asn1Primitive instanceof DERBitString)
                    {
                        DERBitString derBitString = (DERBitString) asn1Primitive;
                        System.out.println(derBitString.toString());
                    }
                }
            }
        }
    
        private static ASN1Primitive toAsn1Primitive(byte[] data) throws Exception
        {
            try (ByteArrayInputStream inStream = new ByteArrayInputStream(data);
                 ASN1InputStream asnInputStream = new ASN1InputStream(inStream);)
            {
                return asnInputStream.readObject();
            }
        }
    
        private static byte[] getECCPubKey() throws Exception {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA");
            ECGenParameterSpec ecParameterSpec = new ECGenParameterSpec("P-256");
            keyPairGenerator.initialize(ecParameterSpec);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
            return keyPair.getPublic().getEncoded();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    ECC签名值DER文件的解析

    1. ECC签名值DER文件的数据结构层次
      在这里插入图片描述
    2. 解析
      参考连接:DER Decode ECDSA Signature in Java
      源码复制
    import java.io.ByteArrayInputStream;
    import java.math.BigInteger;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.Security;
    import java.security.Signature;
    import java.security.spec.ECGenParameterSpec;
    
    import org.bouncycastle.asn1.ASN1Encodable;
    import org.bouncycastle.asn1.ASN1InputStream;
    import org.bouncycastle.asn1.ASN1Integer;
    import org.bouncycastle.asn1.ASN1Primitive;
    import org.bouncycastle.asn1.ASN1Sequence;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    public class DecodeEcdsaSignature {
    
        public static void main(String[] args) throws Exception {
            Security.addProvider(new BouncyCastleProvider());
    
            byte[] signature = getSignature();      
            ASN1Primitive asn1 = toAsn1Primitive(signature);
    
            if (asn1 instanceof ASN1Sequence) {
                ASN1Sequence asn1Sequence = (ASN1Sequence) asn1;
                ASN1Encodable[] asn1Encodables = asn1Sequence.toArray();
                for (ASN1Encodable asn1Encodable : asn1Encodables) {
                    ASN1Primitive asn1Primitive = asn1Encodable.toASN1Primitive();
                    if (asn1Primitive instanceof ASN1Integer) {
                        ASN1Integer asn1Integer = (ASN1Integer) asn1Primitive;
                        BigInteger integer = asn1Integer.getValue();
                        System.out.println(integer.toString());
                    }
                }
            }
    
        }
    
        private static ASN1Primitive toAsn1Primitive(byte[] data) throws Exception
        {
            try (ByteArrayInputStream inStream = new ByteArrayInputStream(data);
                    ASN1InputStream asnInputStream = new ASN1InputStream(inStream);) 
            {
                return asnInputStream.readObject();
            }
        }
    
        private static byte[] getSignature() throws Exception {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA");
            ECGenParameterSpec ecParameterSpec = new ECGenParameterSpec("P-256");
            keyPairGenerator.initialize(ecParameterSpec);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
            Signature signature = Signature.getInstance("SHA256withECDSA");
            signature.initSign(keyPair.getPrivate());
            signature.update("message to sign".getBytes("UTF-8"));
    
            return signature.sign();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    有关DER文件的解析核心在于找到对应文件的数据结构层次信息。

  • 相关阅读:
    linux 内核 dump_page
    Java之System.getProperty()的作用及使用说明
    流式结构化数据计算语言的进化与新选择
    【Java面试】Mysql事务的实现原理
    Vue04/计算属性完整写法 get() set( )、Vue侦听器 watch
    协议约定问题
    android 12.0app应用卸载黑名单
    4年博主写博客的折腾之路
    numpy库的使用方法—Python
    Django对数据库进行增加以及查询显示功能实现
  • 原文地址:https://blog.csdn.net/qq_43549604/article/details/127771313