zoukankan      html  css  js  c++  java
  • java解析密钥格式

    import java.io.StringReader;
    
    import org.bouncycastle.asn1.ASN1Sequence;
    import org.bouncycastle.asn1.DERBitString;
    import org.bouncycastle.asn1.DEREncodable;
    import org.bouncycastle.asn1.DERObjectIdentifier;
    import org.bouncycastle.asn1.DEROctetString;
    import org.bouncycastle.asn1.DERSequence;
    import org.bouncycastle.asn1.DERTaggedObject;
    import org.bouncycastle.openssl.PEMReader;
    import org.bouncycastle.util.encoders.Base64;
    //bcmail-jdk15-1.46
    //bcprov-jdk15.1.46
    
    @SuppressWarnings("all")
    public class CheckKeyFormat {
    
        /**
         * check sm2 PrivateKey Format
         * 
         * @author 杜文磊
         * 
         * */
        public static void main(String[] args) throws Exception {
    //         String key = "-----BEGIN EC PRIVATE KEY-----"
    //         + "MHcCAQEEIEzQsN3BumQJd5ri/9boIs8kluKKQNJ7DPxeT4TKSyPkoAoGCCqGSM49"
    //         + "AwEHoUQDQgAEnr6UttffZuM/w8QehrCOtFm8FpjgJxHt+qRNcH0je+DSXVBJwZkV"
    //         + "7slL7e1VbRe4mh0JsSuLu6XD5P3iHyOnsw=="
    //         + "-----END EC PRIVATE KEY-----";
            String key = "-----BEGIN EC PRIVATE KEY-----"
                    + "MHcCAQEEIGsDOEC1seWulpvO0N09WmKvCOhMAD0eJY5y1i+0Na6HoAoGCCqBHM9V"
                    + "AYItoUQDQgAE450G+j/3ndC+BA30RmbCMjsh12DhGLOwXy8X2VNC8Zb6F9IDgakb"
                    + "B47+n2N8ct8tryfMORh08QckBY66PtuUkQ=="
                    + "-----END EC PRIVATE KEY-----";
            key = key.replace("-----BEGIN EC PRIVATE KEY-----", "");
            key = key.replace("-----END EC PRIVATE KEY-----", "");
            byte[] decKey = Base64.decode(key);
            DERSequence derSequence = (DERSequence) ASN1Sequence
                    .fromByteArray(decKey);
    
            // 检查 version
            DEREncodable derIntegerValue = checkInteger_Version(derSequence);
            System.out.println("Integer : version = " + derIntegerValue);
    
            // 检查私钥长度
            DEREncodable derSM2PrivateValue = checkSM2Private_length(derSequence);
            System.out.println("SM2Private : length = "
                    + ((DEROctetString) derSM2PrivateValue.getDERObject())
                            .getOctets().length);
    
            // 检查OID
            DERObjectIdentifier derObjOID = checkOID(derSequence);
            System.out.println("OID = " + derObjOID);
    
            // 检查内容值
            DERBitString derBitEnd = checkContent(derSequence);
            System.out.println("Content = " + derBitEnd.getString());
            
            if(!derIntegerValue.toString().equals("1")){
                System.out.println(" version is not 1 ! ");
            }
            if(!derObjOID.toString().equals("1.2.156.10197.1.301")){
                System.err.println(" OID Not SM2 private key!");
    //            System.exit(0);
            }
            
        }
    
        /************************************************************utils******************************************************************/
        private static DERBitString checkContent(DERSequence derSequence) {
            DEREncodable derEnd = derSequence.getObjectAt(3);
            if (!(derEnd.getDERObject() instanceof DERTaggedObject)) {
                System.out.println(false);
            }
    
            DERTaggedObject derTagEnd = (DERTaggedObject) derEnd.getDERObject();
            if (!(derTagEnd.getObject() instanceof DERBitString)) {
                System.out.println(false);
            }
            DERBitString derBitEnd = (DERBitString) derTagEnd.getObject();
            return derBitEnd;
        }
    
        /**
         * @see 检查OID
         * @param derSequence
         * @return
         */
        private static DERObjectIdentifier checkOID(DERSequence derSequence) {
            DEREncodable derOID = derSequence.getObjectAt(2);
            if (!(derOID.getDERObject() instanceof DERTaggedObject)) {
                System.out.println(false);
            }
            DERTaggedObject derTagOID = (DERTaggedObject) derOID;
            if (!(derTagOID.getObject() instanceof DERObjectIdentifier)) {
                System.out.println(false);
            }
            DERObjectIdentifier derObjOID = (DERObjectIdentifier) derTagOID
                    .getObject();
            return derObjOID;
        }
    
        /**
         * @see 检查私钥长度
         * @param derSequence
         * @return
         */
        private static DEREncodable checkSM2Private_length(DERSequence derSequence) {
            DEREncodable derSM2PrivateValue = derSequence.getObjectAt(1);
            if (!(derSM2PrivateValue.getDERObject() instanceof DEROctetString)) {
                System.out.println(false);
            }
            return derSM2PrivateValue;
        }
    
        /**
         * @see 检查私钥version
         * @param derSequence
         * @return
         */
        private static DEREncodable checkInteger_Version(DERSequence derSequence) {
            DEREncodable derIntegerValue = derSequence.getObjectAt(0);
            return derIntegerValue;
        }
    
    }
    如果有使用请标明来源:http://www.cnblogs.com/duwenlei/
  • 相关阅读:
    Android Studio使用百度地图(二)
    Android Studio使用百度地图(一)
    寒假每日日报30(体温登记app——进度3)
    EF CodeFirst数据注解特性详解
    EF CodeFirst配置领域类
    EF CodeFirst简介、默认约定、数据库初始化策略
    EF CodeFirst关于Mysql如何自动生成数据库表
    EF的预先加载--Eager Loading
    EF的延迟加载LazyLoad
    ADO.NET中sqlserver和mysql的变量名
  • 原文地址:https://www.cnblogs.com/duwenlei/p/4317666.html
Copyright © 2011-2022 走看看