• java 使用bc库封装ASN1结构案例


    1、概要

            在案例之前,我们需要了解一下啥是ASN1?ASN.1抽象语法标记是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。也就是说不管C语言、Java、Python都是能够将ASN1编码结构进行相互转化。其次简单说一下bc这个库是啥?BC全名是BouncyCastle,他是一个第三方密码算法相关得库,包括国密算法SM2,对称,非对称等等。

    2、案例 

    下面主要是通过BC库,通过一些GM/T国密标准文档去实现ASN1结构封装得案例,来帮助大家封装ASN1结构代码。首先ASN1结构类型主要有三大类型。我会对分别三种使用java进行封装

    • SEQUENCE      // 基本序列结构

    • ENUMERATED // 枚举结构
    • CHIOCE            // 选择结构
    • ​​​​​​​

     

    出除了基本结构还有常用得类型也需要大家了解一下:Extensions、ASN1OctetString、ASN1Integer、ASN1GeneralizedTime、ASN1BitString规律就是一般都是根据下面得结构属性名称加一个ASN1就是这个类型(但是实际中也是需要自己去试)。

    1. public class AppUserInfo extends ASN1Object {
    2. private ASN1Integer userCertNo;
    3. private SubjectPublicKeyInfo userPubKey;
    4. private ASN1GeneralizedTime notBefore;
    5. private ASN1GeneralizedTime notAfter;
    6. private ASN1OctetString userName;
    7. private ASN1IA5String dsCode;
    8. private ASN1IA5String extendInfo;
    9. private static final int TAG_USER_NAME = 0;
    10. private static final int TAG_DS_CODE = 1;
    11. private static final int TAG_EXTEND_INFO = 2;
    12. public static AppUserInfo getInstance(ASN1TaggedObject obj, boolean explicit)
    13. {
    14. return getInstance(ASN1Sequence.getInstance(obj, explicit));
    15. }
    16. public static AppUserInfo getInstance(Object obj) {
    17. if (obj instanceof AppUserInfo) {
    18. return (AppUserInfo) obj;
    19. } else {
    20. return obj != null ? new AppUserInfo(ASN1Sequence.getInstance(obj)) : null;
    21. }
    22. }
    23. public AppUserInfo(ASN1Sequence sequence) {
    24. if (sequence.size() == 7) {
    25. this.userCertNo = ASN1Integer.getInstance(sequence.getObjectAt(0));
    26. this.userPubKey = SubjectPublicKeyInfo.getInstance(sequence.getObjectAt(1));
    27. this.notBefore = ASN1GeneralizedTime.getInstance(sequence.getObjectAt(2));
    28. this.notAfter = ASN1GeneralizedTime.getInstance(sequence.getObjectAt(3));
    29. this.userName = ASN1OctetString.getInstance(sequence.getObjectAt(4));
    30. this.dsCode = ASN1IA5String.getInstance(sequence.getObjectAt(5));
    31. this.extendInfo = ASN1IA5String.getInstance(sequence.getObjectAt(6));
    32. } else {
    33. throw new IllegalArgumentException("Bad sequence size: " + sequence.size());
    34. }
    35. }
    36. @Override
    37. public ASN1Primitive toASN1Primitive() {
    38. ASN1EncodableVector vec = new ASN1EncodableVector(7);
    39. vec.add(this.userCertNo);
    40. vec.add(this.userPubKey);
    41. vec.add(this.notBefore);
    42. vec.add(this.notAfter);
    43. vec.add(this.userName);
    44. vec.add(this.dsCode);
    45. vec.add(this.extendInfo);
    46. return new DERSequence(vec);
    47. }
    48. }

    1. import java.math.BigInteger;
    2. import org.bouncycastle.asn1.ASN1Enumerated;
    3. import org.bouncycastle.asn1.ASN1Object;
    4. import org.bouncycastle.asn1.ASN1Primitive;
    5. /**
    6. * OCSP RFC 2560, RFC 6960
    7. *

    8. * The OCSPResponseStatus enumeration.
    9. *
    10. * OCSPResponseStatus ::= ENUMERATED {
    11. * successful (0), --Response has valid confirmations
    12. * malformedRequest (1), --Illegal confirmation request
    13. * internalError (2), --Internal error in issuer
    14. * tryLater (3), --Try again later
    15. * --(4) is not used
    16. * sigRequired (5), --Must sign the request
    17. * unauthorized (6) --Request unauthorized
    18. * }
    19. *
  • */
  • public class OCSPResponseStatus
  • extends ASN1Object
  • {
  • public static final int SUCCESSFUL = 0;
  • public static final int MALFORMED_REQUEST = 1;
  • public static final int INTERNAL_ERROR = 2;
  • public static final int TRY_LATER = 3;
  • public static final int SIG_REQUIRED = 5;
  • public static final int UNAUTHORIZED = 6;
  • private ASN1Enumerated value;
  • /**
  • * RFC 2560, RFC 6960
  • *

  • * The OCSPResponseStatus enumeration.
  • *
  • * OCSPResponseStatus ::= ENUMERATED {
  • * successful (0), --Response has valid confirmations
  • * malformedRequest (1), --Illegal confirmation request
  • * internalError (2), --Internal error in issuer
  • * tryLater (3), --Try again later
  • * --(4) is not used
  • * sigRequired (5), --Must sign the request
  • * unauthorized (6) --Request unauthorized
  • * }
  • *
  • */
  • public OCSPResponseStatus(
  • int value)
  • {
  • this(new ASN1Enumerated(value));
  • }
  • private OCSPResponseStatus(
  • ASN1Enumerated value)
  • {
  • this.value = value;
  • }
  • public static OCSPResponseStatus getInstance(
  • Object obj)
  • {
  • if (obj instanceof OCSPResponseStatus)
  • {
  • return (OCSPResponseStatus)obj;
  • }
  • else if (obj != null)
  • {
  • return new OCSPResponseStatus(ASN1Enumerated.getInstance(obj));
  • }
  • return null;
  • }
  • public int getIntValue()
  • {
  • return value.intValueExact();
  • }
  • public BigInteger getValue()
  • {
  • return value.getValue();
  • }
  • public ASN1Primitive toASN1Primitive()
  • {
  • return value;
  • }
  • }
    1. import org.bouncycastle.asn1.ASN1Choice;
    2. import org.bouncycastle.asn1.ASN1Encodable;
    3. import org.bouncycastle.asn1.ASN1Null;
    4. import org.bouncycastle.asn1.ASN1Object;
    5. import org.bouncycastle.asn1.ASN1Primitive;
    6. import org.bouncycastle.asn1.ASN1TaggedObject;
    7. import org.bouncycastle.asn1.ASN1Util;
    8. import org.bouncycastle.asn1.DERNull;
    9. import org.bouncycastle.asn1.DERTaggedObject;
    10. public class CertStatus
    11. extends ASN1Object
    12. implements ASN1Choice
    13. {
    14. private int tagNo;
    15. private ASN1Encodable value;
    16. /**
    17. * create a CertStatus object with a tag of zero.
    18. */
    19. public CertStatus()
    20. {
    21. tagNo = 0;
    22. value = DERNull.INSTANCE;
    23. }
    24. public CertStatus(
    25. RevokedInfo info)
    26. {
    27. tagNo = 1;
    28. value = info;
    29. }
    30. public CertStatus(
    31. int tagNo,
    32. ASN1Encodable value)
    33. {
    34. this.tagNo = tagNo;
    35. this.value = value;
    36. }
    37. private CertStatus(
    38. ASN1TaggedObject choice)
    39. {
    40. int tagNo = choice.getTagNo();
    41. switch (tagNo)
    42. {
    43. case 0:
    44. value = ASN1Null.getInstance(choice, false);
    45. break;
    46. case 1:
    47. value = RevokedInfo.getInstance(choice, false);
    48. break;
    49. case 2:
    50. // UnknownInfo ::= NULL
    51. value = ASN1Null.getInstance(choice, false);
    52. break;
    53. default:
    54. throw new IllegalArgumentException("Unknown tag encountered: " + ASN1Util.getTagText(choice));
    55. }
    56. this.tagNo = tagNo;
    57. }
    58. public static CertStatus getInstance(
    59. Object obj)
    60. {
    61. if (obj == null || obj instanceof CertStatus)
    62. {
    63. return (CertStatus)obj;
    64. }
    65. else if (obj instanceof ASN1TaggedObject)
    66. {
    67. return new CertStatus((ASN1TaggedObject)obj);
    68. }
    69. throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
    70. }
    71. public static CertStatus getInstance(
    72. ASN1TaggedObject obj,
    73. boolean explicit)
    74. {
    75. return getInstance(obj.getObject()); // must be explicitly tagged
    76. }
    77. public int getTagNo()
    78. {
    79. return tagNo;
    80. }
    81. public ASN1Encodable getStatus()
    82. {
    83. return value;
    84. }
    85. /**
    86. * Produce an object suitable for an ASN1OutputStream.
    87. *
    88. * CertStatus ::= CHOICE {
    89. * good [0] IMPLICIT NULL,
    90. * revoked [1] IMPLICIT RevokedInfo,
    91. * unknown [2] IMPLICIT UnknownInfo }
    92. *
  • */
  • public ASN1Primitive toASN1Primitive()
  • {
  • return new DERTaggedObject(false, tagNo, value);
  • }
  • }
  • 相关阅读:
    QT实现点击表格控件获取位置
    毕业一周年,工作一周年,感想理解篇
    【css】sass中的模块化
    golang-bufio 缓冲写
    Redis第十二讲:如何保证数据一致性、缓存设计模式、缓存穿透问题解决
    使用Ascend八卡训练报错,len to make them match
    Qt工程打包工具 windeployqt 的用法
    【爬虫进阶】猿人学任务一之JS混淆(难度2.0)
    luming.02无限进步 #我的创作纪念日
    【915程序设计】16西交大软件专硕915程序设计真题讲解
  • 原文地址:https://blog.csdn.net/m0_43432638/article/details/127447616