ASN.1简介
定义
不同系统之间通信需要面对的一个基本问题是数据从发送端到接收端的高效转换。在 OSI(开发式系统互联参考模型) 参考模型,为了方便数据传输,数据类型和数据结构都表现为应用层的一个函数接口。在表示层完成数据到规定地可传输的二进制序列的转换。功能的分离使得应用层仅承担
处理数据的内容和结构,而将数据表示的工作留给表示层。与这种分离机制相应地,我们提出一种数据和结构表示的抽象语法,这种标记语法就是 ASN.1(Abstract Syntax Notation One)。
ASN.1 的目的
ASN.1 是用户在应用层使用的一个基本工具。它提供了描述将在两个完全独立的系统之间交换的数据的能力。
ASN.1 提供给了应用层和协议开发者一个高级工具-----一种数据定义语言,该语言定义了可以再不同系统间通信的协议语法和信息。ASN.1描述的数据结构能够本地化为某一系统本地数据定义。ASN.1 的很多语法定义都跟程序语言的数据类型定义类似。
现在我们实现解析ASN.1 ,代码如下:
...
int asn1parse( const unsigned char *buffer,
int length,
struct asn1struct *top_level_token )
{
unsigned int tag;
unsigned char tag_length_byte;
unsigned long tag_length;
const unsigned char *ptr;
const unsigned char *ptr_begin;
struct asn1struct *token;
ptr = buffer;
token = top_level_token;
while ( length )
{
ptr_begin = ptr;
tag = *ptr;
ptr++;
length--;
if ( ( tag & 0x1F ) == 0x1F )
{
tag = 0;
while ( *ptr & 0x80 )
{
tag <<= 8;
tag |= *ptr & 0x7F;
}
}
tag_length_byte = *ptr;
ptr++;
length--;
if ( tag_length_byte & 0x80 )
{
const unsigned char *len_ptr = ptr;
tag_length = 0;
while ( ( len_ptr - ptr ) < ( tag_length_byte & 0x7F ) )
{
tag_length <<= 8;
tag_length |= *(len_ptr++);
length--;
}
ptr = len_ptr;
}
else
{
tag_length = tag_length_byte;
}
token->constructed = tag & 0x20;
token->tag_class = ( tag & 0xC0 ) >> 6;
token->tag = tag & 0x1F;
token->length = tag_length;
token->data = ptr;
token->children = NULL;
token->next = NULL;
if ( tag & 0x20 )
{
token->length = tag_length + ( ptr - ptr_begin );
token->data = ptr_begin;
token->children = ( struct asn1struct * )
malloc( sizeof( struct asn1struct ) );
asn1parse( ptr, tag_length, token->children );
}
ptr += tag_length;
length -= tag_length;
if ( length )
{
token->next = ( struct asn1struct * ) malloc( sizeof( struct asn1struct ) );
token = token->next;
}
}
return 0;
}
...
我们运行查看效果,如下图所示:
详细教程可以联系作者。
# 加密通信协议视频教程
## 基础
* --- 1. 课程介绍.mp4
* --- 2. 加密通信协议介绍.mp4
* --- 3. socket复习.mp4
* --- 4. http协议简单实现.mp4
* --- 5. http加密协议实现-base64.mp4
* --- 6. http加密协议实现-des.mp4
* --- 7. http加密协议实现-aes.mp4
* --- 8. http加密协议实现-rc4.mp4
* --- 9. http加密协议实现-ecc.mp4
* --- 10.http加密协议实现-rsa.mp4
* --- 11.数字签名算法-MD5算法.mp4
* --- 12.数字签名算法-SHA-1算法.mp4
* --- 13.数字签名算法-SHA-256算法.mp4
* --- 14.数字签名算法-ECDSA.mp4
* --- 15.数字签名算法-DSA.mp4
* --- 16.数字签名算法-HMAC.mp4
* --- 17.证书语法表示法-ASN.1.mp4
* --- 18.证书格式-X.509.mp4
* --- 19.https简单实现(上).mp4
* --- 20.https简单实现(中).mp4
* --- 21.https简单实现(下).mp4
## openssl
* --- 22.openssl 编译与安装
* --- 23.openssl 堆栈
* --- 24.openssl 哈希表
* --- 25.openssl 内在分配
* --- 26.openssl 动态模块加载
* --- 27.openssl 抽象IO
* --- 28.openssl 配置文件
* --- 29.openssl 随机数
* --- 30.openssl 文本数据库
* --- 31.openssl 大数
* --- 32.openssl BASE64编解码
* --- 33.openssl ASN1库
* --- 34.openssl 错误处理
* --- 35.openssl 摘要与HMAC
* --- 36.openssl RSA
* --- 37.openssl DSA
* --- 38.openssl DH
* --- 39.openssl ECC
* --- 40.openssl EVP
* --- 41.openssl Engine
* --- 42.openssl PEM
* --- 43.openssl 通用数据结构
* --- 44.openssl 证书申请
* --- 45.openssl X509数字证书
* --- 46.openssl OCSP
* --- 47.openssl PKCS7
* --- 48.openssl PKCS12
* --- 49.openssl ssl实现
* --- 50.openssl 命令
* --- 51.总结
原文始发于微信公众号(哆啦安全):加密通信证书语法表示法-ASN.1
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论