您的位置:首页 > 其它

2015.11.9

2015-11-10 21:47 155 查看
由于学习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个部分,没有这个规范可能电子签章也能开发,但是不能通用,也不能拿到相关资质(国家保密局,国家公安部)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: