1. import java.io.StringReader;
  2.  
  3. import org.bouncycastle.asn1.ASN1Sequence;
  4. import org.bouncycastle.asn1.DERBitString;
  5. import org.bouncycastle.asn1.DEREncodable;
  6. import org.bouncycastle.asn1.DERObjectIdentifier;
  7. import org.bouncycastle.asn1.DEROctetString;
  8. import org.bouncycastle.asn1.DERSequence;
  9. import org.bouncycastle.asn1.DERTaggedObject;
  10. import org.bouncycastle.openssl.PEMReader;
  11. import org.bouncycastle.util.encoders.Base64;
  12. //bcmail-jdk15-1.46
  13. //bcprov-jdk15.1.46
  14.  
  15. @SuppressWarnings("all")
  16. public class CheckKeyFormat {
  17.  
  18. /**
  19. * check sm2 PrivateKey Format
  20. *
  21. * @author 杜文磊
  22. *
  23. * */
  24. public static void main(String[] args) throws Exception {
  25. // String key = "-----BEGIN EC PRIVATE KEY-----"
  26. // + "MHcCAQEEIEzQsN3BumQJd5ri/9boIs8kluKKQNJ7DPxeT4TKSyPkoAoGCCqGSM49"
  27. // + "AwEHoUQDQgAEnr6UttffZuM/w8QehrCOtFm8FpjgJxHt+qRNcH0je+DSXVBJwZkV"
  28. // + "7slL7e1VbRe4mh0JsSuLu6XD5P3iHyOnsw=="
  29. // + "-----END EC PRIVATE KEY-----";
  30. String key = "-----BEGIN EC PRIVATE KEY-----"
  31. + "MHcCAQEEIGsDOEC1seWulpvO0N09WmKvCOhMAD0eJY5y1i+0Na6HoAoGCCqBHM9V"
  32. + "AYItoUQDQgAE450G+j/3ndC+BA30RmbCMjsh12DhGLOwXy8X2VNC8Zb6F9IDgakb"
  33. + "B47+n2N8ct8tryfMORh08QckBY66PtuUkQ=="
  34. + "-----END EC PRIVATE KEY-----";
  35. key = key.replace("-----BEGIN EC PRIVATE KEY-----", "");
  36. key = key.replace("-----END EC PRIVATE KEY-----", "");
  37. byte[] decKey = Base64.decode(key);
  38. DERSequence derSequence = (DERSequence) ASN1Sequence
  39. .fromByteArray(decKey);
  40.  
  41. // 检查 version
  42. DEREncodable derIntegerValue = checkInteger_Version(derSequence);
  43. System.out.println("Integer : version = " + derIntegerValue);
  44.  
  45. // 检查私钥长度
  46. DEREncodable derSM2PrivateValue = checkSM2Private_length(derSequence);
  47. System.out.println("SM2Private : length = "
  48. + ((DEROctetString) derSM2PrivateValue.getDERObject())
  49. .getOctets().length);
  50.  
  51. // 检查OID
  52. DERObjectIdentifier derObjOID = checkOID(derSequence);
  53. System.out.println("OID = " + derObjOID);
  54.  
  55. // 检查内容值
  56. DERBitString derBitEnd = checkContent(derSequence);
  57. System.out.println("Content = " + derBitEnd.getString());
  58.  
  59. if(!derIntegerValue.toString().equals("1")){
  60. System.out.println(" version is not 1 ! ");
  61. }
  62. if(!derObjOID.toString().equals("1.2.156.10197.1.301")){
  63. System.err.println(" OID Not SM2 private key!");
  64. // System.exit(0);
  65. }
  66.  
  67. }
  68.  
  69. /************************************************************utils******************************************************************/
  70. private static DERBitString checkContent(DERSequence derSequence) {
  71. DEREncodable derEnd = derSequence.getObjectAt(3);
  72. if (!(derEnd.getDERObject() instanceof DERTaggedObject)) {
  73. System.out.println(false);
  74. }
  75.  
  76. DERTaggedObject derTagEnd = (DERTaggedObject) derEnd.getDERObject();
  77. if (!(derTagEnd.getObject() instanceof DERBitString)) {
  78. System.out.println(false);
  79. }
  80. DERBitString derBitEnd = (DERBitString) derTagEnd.getObject();
  81. return derBitEnd;
  82. }
  83.  
  84. /**
  85. * @see 检查OID
  86. * @param derSequence
  87. * @return
  88. */
  89. private static DERObjectIdentifier checkOID(DERSequence derSequence) {
  90. DEREncodable derOID = derSequence.getObjectAt(2);
  91. if (!(derOID.getDERObject() instanceof DERTaggedObject)) {
  92. System.out.println(false);
  93. }
  94. DERTaggedObject derTagOID = (DERTaggedObject) derOID;
  95. if (!(derTagOID.getObject() instanceof DERObjectIdentifier)) {
  96. System.out.println(false);
  97. }
  98. DERObjectIdentifier derObjOID = (DERObjectIdentifier) derTagOID
  99. .getObject();
  100. return derObjOID;
  101. }
  102.  
  103. /**
  104. * @see 检查私钥长度
  105. * @param derSequence
  106. * @return
  107. */
  108. private static DEREncodable checkSM2Private_length(DERSequence derSequence) {
  109. DEREncodable derSM2PrivateValue = derSequence.getObjectAt(1);
  110. if (!(derSM2PrivateValue.getDERObject() instanceof DEROctetString)) {
  111. System.out.println(false);
  112. }
  113. return derSM2PrivateValue;
  114. }
  115.  
  116. /**
  117. * @see 检查私钥version
  118. * @param derSequence
  119. * @return
  120. */
  121. private static DEREncodable checkInteger_Version(DERSequence derSequence) {
  122. DEREncodable derIntegerValue = derSequence.getObjectAt(0);
  123. return derIntegerValue;
  124. }
  125.  
  126. }

java解析密钥格式的更多相关文章

  1. Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包

    秀才坤坤出品 一.epub格式电子书 相关材料和源码均在链接中可以下载:http://pan.baidu.com/s/1bnm8YXT 包括 1.JAVA项目工程test_epub,里面包括了jar包 ...

  2. .NET与JAVA RSA密钥格式转换

    一.该篇内容用于记录.net和Java之间,RSA公密钥的转换 using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; ...

  3. java 解析json格式数据(转)

    2012-07-30 16:43:54|  分类: java |  标签:java  json  |举报|字号 订阅     有时候我们可能会用到json格式的数据进行数据的传输,那么我们怎么把接收到 ...

  4. java解析Xml格式的字符串

    最近在工作中,需要调别的接口,接口返回的是一个字符串,而且内容是xml格式的,结果在解析json的时候报错,最终修改了接口的返回方式,以Map返回, 才得以接收到这个xml的字符串,然后通过dom4j ...

  5. Java解析XML格式串(JDOM解析)

    import java.io.IOException; import java.io.StringReader; import java.util.List; import org.jdom.Docu ...

  6. java 解析json格式数据

    有时候可能会用到json格式进行数据的传输,那么怎么把接收到的数据解析出来呢? 下面介绍两种解析json数据的方法: 1.通过谷歌的Gson来进行解析: json数据:sTotalString = { ...

  7. [Java] Java解析XML格式Response后组装成Map

    //Get and Parse Response def response = context.expand(‘${TestStepName#Response}’) def xmlParser = n ...

  8. JAVA,NET RSA密钥格式转换

    JAVA和NET RSA密钥格式相互转换(公钥,私钥) 做了一个小项目遇到java和.net非对称加密问题,java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的 ...

  9. Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

随机推荐

  1. 1020: 部分A+B

    1020: 部分A+B 时间限制: 1 Sec  内存限制: 128 MB提交: 307  解决: 223[提交][状态][讨论版] 题目描述 正整数A的“DA(为1位整数)部分”定义为由A中所有DA ...

  2. beta-1阶段各组员的贡献分分配

    小组名称:nice! 小组成员:李权 于淼 刘芳芳 韩媛媛 宫丽君 项目内容:约跑app 分数分配规则 个人贡献分=基本贡献分*0.2+特殊贡献分*0.3+个人代码贡献量*0.5 其中 基本贡献分,特 ...

  3. 【RoR win32】新建rails项目找不到script/server的解决办法

    现象: D:\>rails new work/demo cd work/demo D:\work\demo>ruby script/server 这时显示出错: ruby: No such ...

  4. C++笔试题(部分)

    1.简述C++11和Boost 2.struct和union与class的区别 3.为什么C++中调用被C编译器编译后的函数要加extern C声明? 4.以下代码哪里不对? #pragma regi ...

  5. Fury观后感

    刚看完,淋雨汽车回来的,电影很精彩.前期略慢热(我还去了躺厕所),军人的黑色幽默,冷酷的军旅生活作为基调.内容我就不ao述了,新兵蛋诺曼的经历是这部电影的为主线(也有人说诺曼是观众的代入点,准确来说他 ...

  6. NOIP201208同余方程

    NOIP201208同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一行,包含两个正整数a, b,用一个空格隔开. 输出格式 输出只有一行,包含 ...

  7. 关于jQuery的bind()\trigger()\triggerHandler()

    1.bind() 事件绑定. 多个事件会链式累加,而不会覆盖. 即 $("div").bind("click",funtion(){alert("te ...

  8. linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-119723.html linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟 xxxxxxxxxx ...

  9. 160914、ionic指令简单布局

    1) 添加引用类库(ionic样式和ionic js文件) 2) 标题栏,页脚栏,内容区 3) Js引入ionic类库,添加页面操作方法和对象 4) 数据初始化 5) Html页面绑定方法和对象 &l ...

  10. sersync实现触发式同步

    金山的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync,能够很方便的实现文件触发式同步 Inotify 是基于inode级别的文件系统监控技术,是一种强大的.细粒度的. ...