2015.11.9

来源:互联网 发布:网络市场调研报告范文 编辑:程序博客网 时间:2024/05/22 16:46

由于学习asn1规范,以及gm/t 0031-2014 规范是门新的学科,故做次笔记。另外可能还需要了解的有 gm/t 0006,0009,pkcs#1等文件。

2015.11.9

1.

学习文章,如下:

 

最近在研究MMS的时候接触到了抽象语义记法ASN.1(Abstract Syntax Notation One),于是对它做了一番了解,下面将这几天的学习到的做下记录,以供以后偷懒。
        ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序,也就是说这种记法独立于编程语言,具有平台无关性。关于它的更多的介绍百度文库有很多资源,这里提供一个 ISO/ITU-T 标准关于本部分标准的链接,全英文看起来是吃力了点,但慢慢品读下来往往会有想不到的收获。(http://www.itu.int/ITU-T/recommendations/index.aspx),在search栏输入x.680~x.683或x.690可以查看到ASN.1的具体标准及编解码的方法,或者从http://www.itu.int/ITU-T/studygroups/com17/languages/获得相关文档。
        有了ASN.1和相关编码的概念之后,接下来就是如何用编程语言实现ASN.1的编解码了,下面结合开源编译器ASN1C对这部分做详细介绍。
        
        一、下载asn.1 编译器ASN1C
                在http://lionet.info/asn1c/download.html处下载,此处我选择了“Windows installer: asn1c-0.9.21.exe”,下载后双击安装即可。
                本文假设安装于“D:\Program Files\asn1c”。

安装完成。在c:\program files\asn1c\  安装文件为asn1c-0.9.21.exe

        二、创建asn.1抽象模型并利用ASN1C编译器生成C语言类型文件
                1、asn.1文本描述如下

点击(此处)折叠或打开

输入文件1.asn1

如下:

RetangleTest DEFINITIONS ::=BEGIN

SES-SignInfo ::=SEQUENCE{

certOCTET STRING,

signatureAlgorithm OBJECT IDENTIFIER,

signDataBIT STRING

}

SES-ESPictrueInfo ::= SEQUENCE{

typeIA5String,

dataOCTET STRING,

widthINTEGER,

heightINTEGER

}

END

00001. RetangleTest DEFINITIONS ::=BEGIN

00002.     Rectangle ::= SEQUENCE{

00003.         height INTEGER,        -- Height of the rectangle

00004.         width INTEGER        -- Width of the rectangle

00005.     }

00006. END

                    保存文件为“D:\Program Files\asn1c\try.asn1"。

                2、利用ASN1C工具生成try.asn1的C语言类型文件
                    假设ASN1C安装在“D:\Program Files\asn1c”路径下,可以按如下步骤生成C语言类型文件:
                    ①打开控制台:"开始-运行-cmd";
                    ②进入到软件目录下:cd “D:\Program Files\asn1c”;
                    ③执行生成指令:输入asn1c -S skeletons -fskeletons-copy -fnative-types try.asn1+回车enter



                    其中-S -fskeletons-copy -fnative-types参数可以在“D:\Program Files\asn1c\Help\asn1c-usage.pdf”使用手册查到相关说明。

                    若执行成功,则有如下信息输出到控制台

 

                并可以看到在“D:\Program Files\asn1c”目录下,增加了许多文件,这些文件都是后面要用到的:
                                    

        三、在VS2010中创建asn.1的编解码demo工程
                1、创建win32 console工程asn1_demo
                2、将步骤二生成的所有.h和.c文件拷贝到asn1_demo工程文件夹下
                3、将.h和.c文件添加到工程中
                                       

                4、创建main.c文件,内容如下

点击(此处)折叠或打开

00001. #include <stdio.h>

00002. #include <sys/types.h>

00003. #include <Rectangle.h>

00004. 

00005. char tab[8];

00006. /*

00007. * This is a custom function which writes the

00008. * encoded output into a global test table

00009. */

00010. static int decode_callback(const void *buffer, size_t size, void *app_key) 

00011. {

00012.     static int i = 0;

00013.     

00014.     memcpy(&tab[i],buffer,size);

00015. 

00016.     i += size;

00017. }

00018. 

00019. 

00020. 

00021. int main()

00022. {

00023.     Rectangle_t *rectangle; /* Type to encode */

00024.     asn_enc_rval_t ec; /* Encoder return value */

00025. 

00026.     /* Allocate the Rectangle_t */

00027.     rectangle = (Rectangle_t*)calloc(1, sizeof(Rectangle_t)); /* not */

00028. 

00029.     if(!rectangle) {

00030.         perror("calloc() failed");

00031.         exit(71); /* better, EX_OSERR */

00032.     }

00033. 

00034.     /* Initialize the Rectangle members */

00035.     rectangle->height = 42; /* any random value */

00036.     rectangle->width = 23; /* any random value */

00037. 

00038. 

00039. 

00040.     /* Encode the Rectangle type as BER (DER) */

00041.     ec = der_encode(&asn_DEF_Rectangle,

00042.         rectangle, decode_callback, tab);

00043. 

00044.     if(ec.encoded == -1) {

00045.         fprintf(stderr,

00046.             "Could not encode Rectangle (at %s)\n",

00047.             ec.failed_type ? ec.failed_type->name : "unknown");

00048.         exit(65); /* better, EX_DATAERR */

00049.     } else {

00050.         fprintf(stderr, "Created %s with BER encoded Rectangle\n",

00051.             "");

00052.     }

00053. 

00054.     /* Also print the constructed Rectangle XER encoded (XML) */

00055.     xer_fprint(stdout, &asn_DEF_Rectangle, rectangle);

00056.     return 0;

00057. }

                5、移除converter-sample.c
                6、编译,若出现头文件找不到问题,在工程属性的头文件包含路径下指定头文件路径即可。
                7、运行,将断点设于最有一句"return 0"处,可看到控制台显示如下,该xml格式的数据是55行执行的结果。
                     此时,观察全局数组table,可以看到里面的内容即为Rectangle的编码后的十六进制数据为 30 06 02 01 2a 02 01 17。

2.

学习文件 基于中间件的电子签章系统设计与开发.pdf

C:\Documents and Settings\Administrator\桌面\电子签章\ASN.1编码规则详解(最全最经典).pdf

C:\Documents and Settings\Administrator\桌面\电子签章\Asn入门手册.docx

C:\Documents and Settings\Administrator\桌面\电子签章\ASN1培训.pps

以上资料还应继续研究。

 

总结:《安全电子签章密码技术规范》 文章主要描述的是用ASN.1抽象语法标记Abstract Syntax Notation One描述的一个规范:

ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。

数据类型如下:

基本数据类型:

UNIVERSAL 0 保留给编码规则使用

UNIVERSAL 1布尔类型

UNIVERSAL 2整型

UNIVERSAL 3零或多个比特的序列

UNIVERSAL4 零或多个字节的序列

UNIVERSAL5 NULL

UNIVERSAL 6 对象标识符类型

UNIVERSAL 7 对象描述符类型

UNIVERSAL 8 外部类型和类型实例

UNIVERSAL 9 实数类型

UNIVERSAL 10 枚举类型

UNIVERSAL 11 嵌入的 pdv 类型

UNIVERSAL 12 UTF8 字符串类型

UNIVERSAL 13 相关对象标识符类型

UNIVERSAL 14-15 保留给本建议的以后版本和国际标准使用

UNIVERSAL 16 序列和类型序列

UNIVERSAL 17 集合和类型的集合

UNIVERSAL 18-22, 25-30 字符串 类型

UNIVERSAL 23-24 时间 类型

UNIVERSAL 31-... 保留给本建议以外的类型和国际标准使用

数据结构

ASN.1 还能够定义如下的数据结构类型:

结构 ( SEQUENCE )

列表 ( SEQUENCE OF )

类型选择 ( CHOICE )

设计到的问题如下:

1.要完全掌握规范中的所有数据类型?和vc或者。Net中的对应关系?

2.本规范在本次电子签章项目中的应用范围和作用。

3.本规范的使用方法(或者说叫编码,解码的方法)?是不是有专门的编译器?(虽然也实验了一个编译器,但是还没有明白到底有啥用?)

还需要学习研究电子签章的流程和实现方法,可能和规范的应用是2个部分,没有这个规范可能电子签章也能开发,但是不能通用,也不能拿到相关资质(国家保密局,国家公安部)

0 0
原创粉丝点击