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个部分,没有这个规范可能电子签章也能开发,但是不能通用,也不能拿到相关资质(国家保密局,国家公安部)
- 2015.11.9
- 2015.11.1
- 2015.11XML
- 2015.11.4
- 2015.11.11
- 2015.11.11
- 2015.11.27
- 2015.11.28
- 2015.11.08_06_02_sed命令
- 2015.11.11 myql编码
- [R]2015.11.17 Practice
- 2015.11.18随笔
- 2015.11.18Demo12,集合
- 2015.11.19Demo13集合
- 2015.11.21_poi
- 2015.11.23一句话
- fzu月赛(2015.11)
- fzu月赛(2015.11)
- 【cocos2dx】监听安卓机的返回键
- [kuangbin带你飞]专题一 简单搜索G - Shuffle'm Up(POJ 3087)
- 欢迎使用CSDN-markdown编辑器
- iOS开发消息篇—NSRunLoop
- Spring源码学习(一源码下载)
- 2015.11.9
- 文件的读取
- 引入矩阵乘法的主要原因来源于线性方程组的应用
- muduo库阅读(20)——时间戳类
- poj 1276 Cash Machine
- UI基础知识 -- UIView UILabel
- mysql性能优化
- Android学习之动态调用碎片
- win7远程桌面连接问题解决方案