来自几年前本人写的一篇博客 http://blog.csdn.net/newyf_cun/article/details/13016069

如下使用libtasn1分析asn1的编码规则。

http://www.linuxfromscratch.org/blfs/view/stable/general/libtasn1.html

https://github.com/Distrotech/libtasn1

http://www.gnu.org/software/libtasn1/

0.ASN.1的编码规则:

  8  7   6  5  4  3  2  1         +        Length        +       Content
-------------------------------------------------------------------------
|Class |X | Tag | |
-------------------------------------------------------------------------
Class:
0 0 Universal
0 1 Application
1 0 Context-speciatic:指Type不需传送,双方约定 IMPLICIT1 1 prviate
X : 0 ---- primitive -----指定:content without a Structure 只有 1个Length 1个Content
1 ---- contructed -----指定:content with addition structure
(如squence,squence of , implicit squence ,implicit squence of )
(Type , Length ,Content )任意个嵌套T-L-C。
Tag: ASN.1中Tag可能超过5个Bits,但是MMS中不会出现
Length: 指Content的长度。

1. 创建模板文件

 bash-2.05$ cat tpl.asn
PKIX1 { } DEFINITIONS IMPLICIT TAGS ::= BEGIN Dss-Sig-Value ::= SEQUENCE {
r INTEGER,
s INTEGER
} END

  分析:定义一个结构体,含有两个整形变量r和s。

2. 创建模板值文件

    bash-2.05$ cat value.asn
dp PKIX1.Dss-Sig-Value r 4243
s 4748

  分析:赋值文件,将r赋值为十进制4243,s赋值十进制4748

3. 将以上模板和值文件asn1编码

bash-2.05$ ./asn1Coding tpl.asn value.asn
Parse: done. var=dp, value=PKIX1.Dss-Sig-Value
var=r, value=4243
var=s, value=4748 name:NULL type:SEQUENCE
name:r type:INTEGER value:0x1093
name:s type:INTEGER value:0x128c Coding: SUCCESS -----------------
Number of bytes=10
30 08 02 02 10 93 02 02 12 8c
----------------- OutputFile=value.out Writing: done.

  

  分析:asn编码后的数据是30 08 02 02 10 93 02 02 12 8c

  其中:十六进制30 = 二进制0011 0000, 表示通用模式(00)的结构体(1)定义(二进制10000=十六进制10) #define ASN1_TAG_SEQUENCE0x10;

  08表示长度为8,即02 02 10 93 02 02 12 8c的长度正好是8;

  02 02 10 93是变量r的类型02(整形#define ASN1_TAG_INTEGER0x02)-长度(02,即值10 93的长度)-和值(十六进制10 93转成十进制为4243);

  02 02 12 8c是变量s的类型02(整形#define ASN1_TAG_INTEGER0x02)-长度(02,即值12 8c的长度)-和值(十六进制12 8c转成十进制为4748);

4. 将以上输出asn1解码

bash-2.05$ ./asn1Decoding tpl.asn value.out PKIX1.Dss-Sig-Value
Parse: done. Decoding: SUCCESS DECODING RESULT:
name:NULL type:SEQUENCE
name:r type:INTEGER value:0x1093
name:s type:INTEGER value:0x128c

  分析:文件value.out中保存着3008020210930202128c

  按照模板tpl.asn解码结构体PKIX1.Dss-Sig-Value得到变量r和s的值。

5. 将asn模板文件转成c代码

bash-2.05$ ./asn1Parser tpl.asn
Done.
bash-2.05$ cat tpl
tpl.asn tpl_asn1_tab.c
bash-2.05$ cat tpl_asn1_tab.c
#if HAVE_CONFIG_H
# include "config.h"
#endif #include <libtasn1.h> const asn1_static_node tpl_asn1_tab[] = {
{ "PKIX1", 536875024, NULL },
{ NULL, 1073741836, NULL },
{ "Dss-Sig-Value", 536870917, NULL },
{ "r", 1073741827, NULL },
{ "s", 3, NULL },
{ NULL, 0, NULL }
};

  

ASN.1编码的更多相关文章

  1. CSP学习之ASN.1编码(一)

    一.定义: 是定义抽象数据类型的标准. 是用于描述数据的表示.编码.传输.解码的灵活记法. 它提供一套正式.无歧义和精确的规则,以描述独立于特定计算机硬件的对象结构. 标准的ASN.1编码规则有其基本 ...

  2. ASN.1编码方式详解

    ASN ASN.1 – Abstract Syntax Notation dot one,抽象记法1.数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为A ...

  3. PKCS#1规范阅读笔记2--------公私钥ASN.1结构

    PKCS#1种介绍了哈希算法的OID等的ASN.1结构,因为使用ASN.1的解码工具(比如:ASN1View)时,会自动显示出各OID的含义,所以这里就不说明了.下面就只简单摘抄一下RSA公私钥的AS ...

  4. JAVA解析各种编码密钥对(DER、PEM、openssh公钥)

    一.DER编码密钥对 先说下DER编码,是因为JCE本身是支持DER编码密钥对的解析的,可以参见PKCS8EncodedKeySpec和X509EncodedKeySpec. DER编码是ASN.1编 ...

  5. openssl ans.1编码规则分析及证书密钥编码方式

    1 数据编码格式 openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释 ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语 ...

  6. ASN.1笔记——语法规则与类型概述

    转载:https://blog.csdn.net/sever2012/article/details/7672699 一.简介 ASN.1(Abstract Syntax Notation doton ...

  7. Openssl ASN.1 说明一 分享

    [引言]ASN.1全称为Abstract Syntax NotationOne,是一种描述数字对象的方法和标准.openssl的编码方法就是基于该标准的,目前,很多其他软件的编码方法也是基于该标准.对 ...

  8. 使用windows crypt API解析X509证书

    一.版本号 结构体CERT_INFO中的字段dwVersion即为证书版本,可以直接通过下面的代码获得: DWORD dwCertVer = m_pCertContext->pCertInfo- ...

  9. Javascript到PHP加密通讯的简单实现

    其实内容主要来源于上一篇博文,只是重新组织了语言,并做了原理性的阐述,更容易理解:P ----------------------------------------- 华丽的分割线 -------- ...

随机推荐

  1. Beta Daily Scrum 第三天

    [目录] 1.任务进度 2.困难及解决 3.燃尽图 4.代码check-in 5.总结 1. 任务进度 学号 今日完成 明日完成 612 初步完成成就界面的统计图表 继续编写成就界面的图表 615 白 ...

  2. 【项目】Http请求在NSMutableURLRequest添加HttpBody的字典params属性

    在请求头中加入字典集合的Body,首先把字典转换成json,然后json转换成NSData,然后加入到HTTPBody中,我有已下写法 // 参数paramsNSDictionary * params ...

  3. MooseFs-分布式文件系统系列(一)之了解并安装它

    preface 在上上家公司,曾维护过公司的MFS文件系统,主要用来存储系统日志文件,单纯的把日志当作文件存储,在当时的架构下,MFS就像一个中间站一样,这边程序生成的日志放入MFS,那边日志分析程序 ...

  4. 关键字static(1)

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念.被static修 ...

  5. JavaWeb---总结(十四)JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  6. oneM2M标准发展神速 实现万物联网的愿景

    http://m2m.iot-online.com/news/2013102224849.html oneM2M则将负责解决独立于接取网路中通用的M2M服务层的关键需求:使其可更方便地嵌入于各种软硬体 ...

  7. 菜鸟之linux问题之图形界面和dos界面的登录问题

    1.安装完linux系统后,图形化界面的用户名和密码是之前安装的时候设置的. 如果想切换到linux的dos窗口快捷键是:ctrl+alt+F2 由dos窗口切换到linux图形界面快捷键是:ctrl ...

  8. Android之Proguard语法

    -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_pat ...

  9. pyqt2_官网教程

    https://pythonspot.com/en/pyqt4/ Articles You can find a collection of PyQT articles below. Applicat ...

  10. HTML5播放器实例

    鉴于html5Audio and video的使用,设计了一个自定义风格的播放器,除实现一些基本的默认功能之外,还实现了一些高级功能. 具体功能如下: 实现播放暂停按钮 实现静音按钮 实现音量调节滑动 ...