当前位置: 首页 > news >正文

《Java 加密工具与技术》ASN.1

定义个对象

ASN.1结构

Implementation of SimpleStructure - an example ASN.1 object (tagging IMPLICIT).
SimpleStructure ::= SEQUENCE {
    version INTEGER DEFAULT 0,
    created GeneralizedTime,
    data OCTET STRING,
    comment [0] UTF8String OPTIONAL
}

完整代码

package appendixA;

import java.math.BigInteger;
import java.text.ParseException;
import java.util.Date;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1GeneralizedTime;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DERGeneralizedTime;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.DERUTF8String;
import org.bouncycastle.util.Arrays;

/**
 * Implementation of SimpleStructure - an example ASN.1 object (tagging
 * IMPLICIT).
 * <pre>
 *     SimpleStructure ::= SEQUENCE {
 *         version INTEGER DEFAULT 0,
 *         created GeneralizedTime,
 *         data OCTET STRING,
 *         comment [0] UTF8String OPTIONAL
 *     }
 * </pre>
 */
public class SimpleStructure
    extends ASN1Object
{
    private final BigInteger version;
    private final Date created;
    private final byte[] data;

    private String comment;

    /**
     * Convert, or cast, the passed in object into a SimpleStructure
     * as appropriate.
     *
     * @param obj the object of interest.
     * @return a SimpleStructure
     */
    public static SimpleStructure getInstance(
        Object  obj)
    {
        if (obj instanceof SimpleStructure)
        {
            return (SimpleStructure)obj;
        }
        else if (obj != null)
        {
            return new SimpleStructure(ASN1Sequence.getInstance(obj));
        }

        return null;
    }

    /**
     * Create a structure with a default version.
     *
     * @param created creation date.
     * @param data encoded data to contain.
     */
    public SimpleStructure(Date created, byte[] data)
    {
        this(0, created, data, null);
    }

    /**
     * Create a structure with a default version and the optional comment.
     *
     * @param created creation date.
     * @param data encoded data to contain.
     * @param comment the comment to use.
     */
    public SimpleStructure(Date created, byte[] data, String comment)
    {
        this(0, created, data, comment);
    }

    /**
     * Create a structure with a specific version and the optional comment.
     *
     * @param version the version number to use.
     * @param created creation date.
     * @param data encoded data to contain.
     * @param comment the comment to use.
     */
    public SimpleStructure(int version, Date created,
                           byte[] data, String comment)
    {
        this.version = BigInteger.valueOf(version);
        this.created = new Date(created.getTime());
        this.data = Arrays.clone(data);

        if (comment != null)
        {
            this.comment = comment;
        }
        else
        {
            this.comment = null;
        }
    }

    // Note: private constructor for sequence - we want users to get
    // into the habit of using getInstance(). It's safer!
    private SimpleStructure(ASN1Sequence seq)
    {
        int index = 0;

        if (seq.getObjectAt(0) instanceof ASN1Integer)
        {
            this.version = ASN1Integer.getInstance(
                                 seq.getObjectAt(0)).getValue();
            index++;
        }
        else
        {
            this.version = BigInteger.ZERO;
        }

        try
        {
            this.created = ASN1GeneralizedTime.getInstance(
                                seq.getObjectAt(index++)).getDate();
        }
        catch (ParseException e)
        {
            throw new IllegalArgumentException(
                "exception parsing created: " + e.getMessage(), e);
        }

        this.data = Arrays.clone(
            ASN1OctetString.getInstance(seq.getObjectAt(index++)).getOctets());

        for (int i = index; i != seq.size(); i++)
        {
            ASN1TaggedObject t = ASN1TaggedObject.getInstance(
                                                     seq.getObjectAt(i));

            if (t.getTagNo() == 0)
            {
                comment = DERUTF8String.getInstance(t, false)
                                                            .getString();
            }
        }
    }

    public BigInteger getVersion()
    {
        return version;
    }

    public Date getCreated()
        throws ParseException
    {
        return new Date(created.getTime());
    }

    public byte[] getData()
    {
        return Arrays.clone(data);
    }

    public String getComment()
    {
        return comment;
    }

    /**
     * Produce a DER representation of the object.
     *
     * @return an ASN1Primitive made up of DER primitives.
     */
    @Override
    public ASN1Primitive toASN1Primitive()
    {
        ASN1EncodableVector v = new ASN1EncodableVector();

        // DER encoding rules specify that fields with
        // the value of their specified DEFAULT are left out
        // of the encoding
        if (!version.equals(BigInteger.ZERO))
        {
             v.add(new ASN1Integer(version));
        }

        v.add(new DERGeneralizedTime(created));
        v.add(new DEROctetString(data));

        if (comment != null)
        {
            v.add(new DERTaggedObject(false, 0, new DERUTF8String(comment)));
        }

        return new DERSequence(v);
    }
}

http://www.dtcms.com/a/62334.html

相关文章:

  • C语言:6.22练习题数组解答
  • 安装、配置和启动 ssh 服务,实现远程连接服务器
  • 【推荐项目】Java的廊坊城市公交查询网站
  • 应急响应入门-bugku靶场
  • 作为一名程序员,学习AI的计划
  • 关于 Proxmark3 的详细介绍、使用指南及配置说明
  • 基于Matlab设计GUI图像处理交互界面
  • HTTP发送POST请求的两种方式
  • 化工行业智慧工厂解决方案(56页PPT)
  • upload-labs-master通关攻略(13~16)
  • J-LangChain - Agent - 编排一个 ReAct + Function Call 反应链
  • 领先AI企业经验谈:探究AI分布式推理网络架构实践
  • 清华同方国产电脑能改windows吗_清华同方国产系统改win7教程
  • 【C++内存管理】:new与delete,operator new与operator delete
  • 简易分析 uni.chooseImage 拍照上传的基本知识点(附Demo)
  • 医疗AI测试实战:如何确保人工智能安全赋能医疗行业?
  • 使用Python爬虫根据关键词获取衣联网商品列表:实战指南
  • 若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值
  • 在Spring Boot项目中如何实现获取FTP远端目录结构
  • PHP框架加载不上.env文件中的变量
  • 选择 DotNetBrowser 还是 EO.WebBrowser
  • 安全的实现数据备份和恢复
  • PawSQL for TDSQL:腾讯云TDSQL数据库性能优化全攻略
  • Linux第18节 --- 重定向与文件IO的基本认识
  • 接口自动化入门 —— swagger/word/excelpdf等不同种类的接口文档理解!
  • std::any详解
  • Java实现死锁
  • 【沐渥科技】氮气柜日常如何维护?
  • nginx 打造高性能 API 网关(‌Building a High-Performance API Gateway with Nginx)
  • Deepin通过二进制方式升级部署高版本 Docker