精华内容
下载资源
问答
  • ASN.1完成ASN.1 Complete

    2019-11-15 17:44:46
    教导初学者和高级读者有关ASN.1的所有知识-无论是为了指定新协议还是在软件或硬件开发项目中实施现有协议。
  • 面向新手和有经验的ASN.1用户,从基本概念到高级概念都进行了整理。 包含与其他语言有关的ASN.1的完整示例和讨论。
  • ASN.1

    2019-07-03 12:45:00
    ASN.1抽象语法标记(Abstract Syntax Notation One https://baike.baidu.com/item/ASN.1/498523?fr=aladdin 转载于:https://www.cnblogs.com/hshy/p/11125752.html

     

    ASN.1抽象语法标记(Abstract Syntax Notation One

    https://baike.baidu.com/item/ASN.1/498523?fr=aladdin

    转载于:https://www.cnblogs.com/hshy/p/11125752.html

    展开全文
  • 1.1 ASN.1概述 1 1.2 ASN.1系列标准 1 1.3 ASN.1编解码的应用与发展前景 2 1.4论文章节结构组织 2 第2章 ASN.1词汇及词法约定 3 2.1 字符集 3 2.2 词项 3 2.3 本章小结 4 第3章 ASN.1数据类型定义 5 3.1 简单数据...
  • ASN.1简介及OpenSSL中ASN.1接口使用举例

    千次阅读 2020-06-02 09:28:28
    ASN.1(Abstract Syntax Notation One)是一套标准,是描述数据的表示、编码传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。OpenSSL的编码方法就是基于该标准。...

    ASN.1(Abstract Syntax Notation One)是一套标准,是描述数据的表示、编码传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。OpenSSL的编码方法就是基于该标准。ASN.1是一种结构化的数字对象描述语言,它包括两部分:数据描述语言和数据编码规则。ASN.1的数据描述语言允许用户自定义基本的数据类型,并可以通过简单的数据类型组成更复杂的数据类型。

    ASN.1是ISO和ITU-T的联合标准,它本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达)。标准的ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。这些编码方法规定了将数字对象转换成应用程序能够处理、保存和网络传输的二进制编码形式的一组规则。PEM编码全称是Privacy Enhanced Mail,是一种保密邮件的编码标准。ASN.1与特定的ASN.1编码规则一起通过使用独立于计算机架构和编程语言的方法来描述数据结构,为结构化数据的交互提供了手段,特别是在网络环境的应用程序。

    OpenSSL的PEM编码就是在DER编码基础上进行BASE64编码,然后添加一些头尾信息组成的,如在生成的rsa private.pem中头信息为-----BEGIN RSA PRIVATE KEY-----,尾信息为-----END RSA PRIVATE KEY-----,中间的数据部分即是对DER进行base64编码后的结果。

    注:以上内容主要整理自网络。

    ASN.1里定义的每个基本对象都有一个对应的数字标识tag,在进行二进制编码的时候需要使用该标识,定义的数字标识在asn1.h头文件中,如下所示:

    /* ASN.1 tag values */
    # define V_ASN1_EOC                      0
    # define V_ASN1_BOOLEAN                  1 /**/
    # define V_ASN1_INTEGER                  2
    # define V_ASN1_BIT_STRING               3
    # define V_ASN1_OCTET_STRING             4
    # define V_ASN1_NULL                     5
    # define V_ASN1_OBJECT                   6
    # define V_ASN1_OBJECT_DESCRIPTOR        7
    # define V_ASN1_EXTERNAL                 8
    # define V_ASN1_REAL                     9
    # define V_ASN1_ENUMERATED               10
    # define V_ASN1_UTF8STRING               12
    # define V_ASN1_SEQUENCE                 16
    # define V_ASN1_SET                      17
    # define V_ASN1_NUMERICSTRING            18 /**/
    # define V_ASN1_PRINTABLESTRING          19
    # define V_ASN1_T61STRING                20
    # define V_ASN1_TELETEXSTRING            20/* alias */
    # define V_ASN1_VIDEOTEXSTRING           21 /**/
    # define V_ASN1_IA5STRING                22
    # define V_ASN1_UTCTIME                  23
    # define V_ASN1_GENERALIZEDTIME          24 /**/
    # define V_ASN1_GRAPHICSTRING            25 /**/
    # define V_ASN1_ISO64STRING              26 /**/
    # define V_ASN1_VISIBLESTRING            26/* alias */
    # define V_ASN1_GENERALSTRING            27 /**/
    # define V_ASN1_UNIVERSALSTRING          28 /**/
    # define V_ASN1_BMPSTRING                30

    ASN.1编码:编码的实际数据由字符串和配置信息确定。字符串的一般格式是:零个或多个逗号分隔的修饰符,后跟一个类型,后跟一个可选的冒号和一个值。

    [modifier,]type[:value]

    modeifier:修饰符,支持的类型包括EXPLICIT、IMPLICIT、SEQWRAP、FORMAT等。

    type:支持的类型包括BOOLEAN、INTEGER、ENUMERATED、BITSTRING等。

    value:数据。

    关于配置文件的更多介绍可以参考:https://www.openssl.org/docs/manmaster/man3/ASN1_generate_v3.html

    通过调用ASN1_generate_nconf函数接口,格式如:"IA5STRING:https://blog.csdn.net/fengbingchun";通过调用i2d_ASN1_OCTET_STRING方式接口,格式如:"https://blog.csdn.net/fengbingchun",测试代码如下:

    int test_openssl_asn1_simple_encode()
    {
    	// test 1
    	const char* src = "IA5STRING:https://blog.csdn.net/fengbingchun";
    	CONF* nconf = nullptr;
    	ASN1_TYPE* encoded = ASN1_generate_nconf(src, nconf);
    	if (!encoded) {
    		fprintf(stderr, "fail to asn1 encode: %s\n", src);
    		return -1;
    	}
    
    	// test 2
    	const char* src2 = "https://blog.csdn.net/fengbingchun";
    	ASN1_STRING asn1str;
    	memset(&asn1str, 0, sizeof(ASN1_STRING));
    	ASN1_STRING_set(&asn1str, src2, strlen(src2));
    	const char *value = reinterpret_cast<char*>(ASN1_STRING_data(&asn1str));
    	fprintf(stdout, "the value is: %s, strlen: %u\n", value, strlen(value));
    
    	std::unique_ptr<unsigned char[]> encoded2(new unsigned char[strlen(src2) + 2]);
    	unsigned char* p = encoded2.get();
    	int encoded2_len = i2d_ASN1_OCTET_STRING(&asn1str, &p);
    	fprintf(stdout, "encoded length: %d\n", encoded2_len);
    
    #ifdef _MSC_VER
    	const char* name = "E:/GitCode/OpenSSL_Test/testdata/simple2.der";
    #else
    	const char* name = "testdata/simple2.der";
    #endif
    	FILE* fp = fopen(name, "wb");
    	if (!fp) {
    		fprintf(stderr, "fail to open file: %s\n", name);
    		return -1;
    	}
    
    	fwrite(encoded2.get(), 1, strlen(src2) + 2, fp);
    	fclose(fp);
    
    	return 0;
    }

    通过配置文件生成,如simple.conf,内容如下:

    asn1 = IA5STRING:https://blog.csdn.net/fengbingchun

    通过openssl asn1parse命令将simple.conf进行asn1编码,编码后的输出文件为simple.der,执行结果如下:

    一般情况下,ASN.1编码多数是通过命令直接生成,如生成rsa私钥的配置文件rsa_private_key.conf,格式如下:

    asn1=SEQUENCE:private_key
    [private_key]
    version=INTEGER:0
    n=INTEGER:0xBB6FE79432CC6EA2D8F970675A5A87BFBE1AFF0BE63E879F2AFFB93644D4D2C6D000430DEC66ABF47829E74B8C5108623A1C0EE8BE217B3AD8D36D5EB4FCA1D9
    e=INTEGER:0x010001
    d=INTEGER:0x6F05EAD2F27FFAEC84BEC360C4B928FD5F3A9865D0FCAAD291E2A52F4AF810DC6373278C006A0ABBA27DC8C63BF97F7E666E27C5284D7D3B1FFFE16B7A87B51D
    p=INTEGER:0xF3929B9435608F8A22C208D86795271D54EBDFB09DDEF539AB083DA912D4BD57
    q=INTEGER:0xC50016F89DFF2561347ED1186A46E150E28BF2D0F539A1594BBD7FE46746EC4F
    exp1=INTEGER:0x9E7D4326C924AFC1DEA40B45650134966D6F9DFA3A7F9D698CD4ABEA9C0A39B9
    exp2=INTEGER:0xBA84003BB95355AFB7C50DF140C60513D0BA51D637272E355E397779E7B2458F
    coeff=INTEGER:0x30B9E4F2AFA5AC679F920FC83F1F2DF1BAF1779CF989447FABC2F5628657053A

    通过openssl asn1parse命令将rsa_private_key.conf进行asn1编码,编码后的输出文件为rsa_private_key.der,执行结果如下:

    ASN.1解码

    对上面生成的simple.der进行解码,可调用d2i_ASN1_IA5STRING相关函数,测试代码如下:

    int test_openssl_simple_decode()
    {
    #ifdef _MSC_VER
    	const char* name = "E:/GitCode/OpenSSL_Test/testdata/simple.der";
    #else
    	const char* name = "testdata/simple.der";
    #endif
    	FILE* fp = fopen(name, "rb");
    	if (!fp) {
    		fprintf(stderr, "fail to open file: %s\n", name);
    		return -1;
    	}
    	fseek(fp, 0, SEEK_END);
    	long length = ftell(fp);
    	rewind(fp);
    
    	std::unique_ptr<unsigned char[]> data(new unsigned char[length + 1]);
    	data.get()[length] = '\0'; // in order to be correct fprintf %s
    	fread(data.get(), 1, length, fp);
    	fclose(fp);
    
    	if (data.get()[0] != V_ASN1_IA5STRING) {
    		fprintf(stderr, "fail to get asn1 tag value: %d, %d\n", data.get()[0], V_ASN1_IA5STRING);
    		return -1;
    	}
    
    	fprintf(stdout, "decode data length: %d\n", data.get()[1]);
    	fprintf(stdout, "decode data: %s\n", (char*)(data.get() + 2));
    
    	const unsigned char* p = data.get();
    	ASN1_IA5STRING* str = ASN1_IA5STRING_new();
    	d2i_ASN1_IA5STRING(&str, &p, length);
    	fprintf(stdout, "decode data: %s\n", str->data);
    	ASN1_IA5STRING_free(str);
    
    	return 0;
    }

    通过命令对上面生成的simple2.der进行解码,执行命令及结果如下:与原始数据一致

    对上面生成的rsa_private_key.der进行解码,测试代码如下:

    typedef struct RSA_PRIVATE_KEY_st {
    	ASN1_INTEGER* version;
    	ASN1_INTEGER* n;
    	ASN1_INTEGER* e;
    	ASN1_INTEGER* d;
    	ASN1_INTEGER* p;
    	ASN1_INTEGER* q;
    	ASN1_INTEGER* exp1;
    	ASN1_INTEGER* exp2;
    	ASN1_INTEGER* coeff;
    } RSA_PRIVATE_KEY;
    DECLARE_ASN1_FUNCTIONS(RSA_PRIVATE_KEY);
    
    ASN1_SEQUENCE(RSA_PRIVATE_KEY) = {
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, version, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, n, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, e, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, d, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, p, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, q, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, exp1, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, exp2, ASN1_INTEGER),
    	ASN1_SIMPLE(RSA_PRIVATE_KEY, coeff, ASN1_INTEGER)
    } ASN1_SEQUENCE_END(RSA_PRIVATE_KEY)
    IMPLEMENT_ASN1_FUNCTIONS(RSA_PRIVATE_KEY)
    
    void print(const ASN1_INTEGER* str, const char* item)
    {
    	fprintf(stdout, "name: %s, type: %d, length: %d, data: ", item, str->type, str->length);
    	for (int i = 0; i < str->length; ++i) {
    		fprintf(stdout, "%02X", str->data[i]);
    	}
    	fprintf(stdout, "\n");
    }
    
    int test_openssl_asn1_complex_decode()
    {
    #ifdef _MSC_VER
    	const char* name = "E:/GitCode/OpenSSL_Test/testdata/rsa_private_key.der";
    #else
    	const char* name = "testdata/rsa_private_key.der";
    #endif
    	FILE* fp = fopen(name, "rb");
    	if (!fp) {
    		fprintf(stderr, "fail to open file: %s\n", name);
    		return -1;
    	}
    	fseek(fp, 0, SEEK_END);
    	long length = ftell(fp);
    	rewind(fp);
    
    	std::unique_ptr<unsigned char[]> data(new unsigned char[length]);
    	fread(data.get(), 1, length, fp);
    	fclose(fp);
    
    	// data.get()[0]: type tag indicating SEQUENCE, 0x30
    	if (data.get()[0] != 0x30) {
    		fprintf(stderr, "it's type should be SEQUENCE: %s, %x\n", name, data.get()[0]);
    		return -1;
    	}
    
    	const unsigned char* p = data.get();
    	RSA_PRIVATE_KEY* key = d2i_RSA_PRIVATE_KEY(nullptr, &p, length);
    	if (!key) {
    		fprintf(stderr, "fail to d2i_RSA_PRIVATE_KEY\n");
    		return -1;
    	}
    
    	print(key->version, "version");
    	print(key->n, "n");
    	print(key->e, "e");
    	print(key->d, "d");
    	print(key->p, "p");
    	print(key->q, "q");
    	print(key->exp1, "exp1");
    	print(key->exp2, "exp2");
    	print(key->coeff, "coeff");
    
    	RSA_PRIVATE_KEY_free(key);
    
    	return 0;
    }

    执行结果如下:与配置文件中的原始数据一致

    通过命令对rsa_private_key.der进行解码,执行结果如下:与上面通过code执行的结果一致

    通过UE打开rsa_private_key.der,结果如下:

    对UE打开的rsa_private_key.der进行说明:

    0x30:说明ASN.1 tag为SEQUENCE类型;

    0x82:指后面两个字节的长度是long form;

    0x013b:指明节点数据字节总长度;

    0x02:version tag为INTEGER;

    0x01:version长度为1;

    0x00:version值为0x00;

    0x02:n tag为INTEGER;

    0x41:n长度为65,因为紧挨着的下一个字节是0x00,表示数据是正整数,所以n的实际长度为64,与code执行结果值一致;

    通过命令对rsa_private_key.der解码进行说明:ASN.1 der结构格式,第一行

    (1).0:表示节点在整个文件中的偏移长度;

    (2).d=0:表示节点深度;

    (3).hl=4:表示节点头字节长度;

    (4).l=315:第一行中指所有节点数据字节长度;其它行表示当前节点数据字节长度;

    (5).cons:表示该节点为结构节点,表示包含子节点或子结构体数据;其它行的prim表示该节点为原始节点,包含数据;

    (6). SEQUENCE:表示ASN.1 tag类型;其它行的INTEGER也是ASN.1的一种tag类型;

    (7).其它行的最后一列:表示节点数据。

    以上代码段的完整code见:GitHub/OpenSSL_Test

    GitHubhttps://github.com//fengbingchun/OpenSSL_Test

    展开全文
  • ASN.1 Editor

    2020-12-02 14:44:29
    ASN.1工具,可查看、修改、编辑asn.1数据;ASN.1工具,可查看、修改、编辑asn.1数据ASN.1工具,可查看、修改、编辑asn.1数据ASN.1工具,可查看、修改、编辑asn.1数据
  • ve added a protobuf and converter to encompass the ASN.1 Universal types that appear in X509 Certificates. Additionally, I've recognized shared functions across the protos and have moved those ...
  • asn.1

    千次阅读 2014-12-09 11:07:03
    asn.1详解: http://wenku.baidu.com/link?url=ZKOPBv5EU_nlRO4JyDxyz75LI4KBdlVVQP_AIJi51CWqmDUGoQ-1B1pQpo-17hWJrdZQc3xwim5TL9VmWNO7IcMKOJSO7hHYMt_JE5saaUW asn.1探索: http://wmfbravo.blog.163.com/ ranap...
    展开全文
  • ASN.1 规则详解 .zip

    2020-09-03 11:26:09
    ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。本文是ASN.1 标准详解 ,这是中文版本的ASN.1标准,这是标准最全的解释,...
  • asn1c, ASN.1 编译器.zip

    2019-10-11 02:50:37
    asn1c, ASN.1 编译器 ASN.1 到C 编译器采用 ASN.1 模块文件( 范例) 并生成 C++ 兼容C 源代码。 代码可以用于将原生C 结构序列化为 compact 和明确的BER/OER/PER/XER-based 数据文件,并反序列化文件。各种 AS
  • MMS and ASN.1 Encodings.pdf

    2019-08-07 10:35:05
    主要描述了ASN.1的具体编码,对于理解ASN.1编码很有帮助。对于MMS的ASN.1编码也很有用处。
  • asn1c:ASN.1编译器-源码

    2021-04-29 08:22:52
    ASN.1到C的编译器采用ASN.1模块文件(示例)并生成C ++兼容的C源代码。 该代码可用于将本机C结构序列化为紧凑且明确的基于BER / OER / PER / XER的数据文件,然后反序列化这些文件。 各种基于ASN.1的格式已在行业中...
  • ASN.1格式解析源码

    2021-04-08 17:30:22
    一个简单的ASN.1格式解析工具,可将ASN.1格式输出。ASN.h(.cpp)包含了ASN.1格式的解析类,ASNFileParse.cpp中提供了常用的pem文件、der文件的解析。本源码未使用Openssl库。 开发环境:Windows+VS2010
  • pyasn1, python的通用 ASN.1 库 用于 python的 ASN.1-库 这是 ASN.1 类型和编解码器的免费和开放源码实现,作为 python 包。 协议首先编写为支持特定协议,然后推广到适合于基于 ASN.1 规范的各种协议。!特性ASN.
  • ASN.1 DER编码器/解码器和DSL。 例子 定义模型: var asn = require ( 'asn1.js' ) ; var Human = asn . define ( 'Human' , function ( ) { this . seq ( ) . obj ( this . key ( 'firstName' ) . octstr ( ) ,...
  • ASN.1编码规则详解.pdf

    2019-07-07 15:09:43
    传智播客C++学员ASN.1参考文档。本章的内容主要翻译自《ASN.1 Communication between Heterogeneous Systems》和《ASN.1 Complete》。
  • ASN.1 for java-开源

    2021-05-02 18:26:27
    适用于Java的ASN.1定义了所有常见ASN.1数据类型的接口和实现,并支持ASN.1数据流的编码和解码。
  • ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序...
  • Python ASN.1-开源

    2021-05-14 15:11:46
    包装Lev Walkin的asn1c代码的Python模块。 将ASN.1表示法转换为C代码,并将此代码内置到python模块中,该模块可以根据ASN.1描述对结构进行解码和解码。
  • LTE-V2X_ASN.1.zip

    2021-04-27 20:15:03
    车联网V2X消息集asn.1定义
  • ASN.1编码规则详解.zip

    2020-10-22 09:33:00
    整理 ASN.1编码规则详解, 包含 ber ,per, a-xdr 编解码说明文档(pdf格式)。 《DLT 790.6-2010 采用配电线载波的配电自动化 第6部分:A-XDR编码规则》 《ASN.1编码规则详解(最全最经典).pdf》 《GBT 16263编码...
  • Cryptix ASN.1 Kit-开源

    2021-05-14 14:36:21
    Cryptix ASN.1套件旨在帮助程序员在编码,访问和生成Java绑定的类型和值(定义为ASN.1构造或如此编码)时面临的任务。
  • 一个用于分析和编辑使用任何ASN.1编码规则(BER, DER, CER, PER, U-PER)的编码数据 的图形用户界面(GUI)工具。它能将ASN.1架构指派给二进制数据,以产生显示所有赋值类型和元件名的多个数据视图。 基础功能可不用...
  • Simple API for ASN.1-开源

    2021-05-14 15:25:23
    一个简单的ASN.1工具包和库,用于向Java类添加ASN.1序列化。 序列化方案的目标是XML集成。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,894
精华内容 2,357
关键字:

asn.1