ASN.1 学习

    ASN.1

章节目录

  1. 简介
  2. 常用数据类型
    2.1 常见的简单类型
    2.2 结构类型
  3. Basic Encoding Rules
  4. Distinguished Encoding Rules
  5. 编码示例
    5.1 BIT STRING
    5.2 IA5String
    5.3 INTEGER
    5.4 NULL
    5.5 OCTET STRING
    5.6 UTCTime
    5.6 OBJECT IDENTIFIER
  6. 编码 Name (X.501 type)

参考 http://luca.ntop.org/Teaching/Appunti/asn1.html.

简介

ASN.1 全称 Abstract Syntax Natation One. 是一个用来描述抽象类型抽象数据的语法. 类似于 XML, JSON 等, 主要用于编码数据以便于在网络中交换数据. 比如, X509 证书.

ASN.1 中定义了四种类型:

  • 简单类型 (Simple types) : 用于编码基本的数据类型. 如 整形,字符串,二进制数据等.
  • 结构类型 (Structured types) : 用于编码复杂数据类型. 如, X509 证书中的公钥.
  • 标记的类型 (Tagged types) : 用于编码从其他几种类型引申而来的类型.
  • 其他类型 (Other types) : CHOICE 或 Any.
  • ASN.1 中每个类型都对应与一个 class 和 非负的 tag number. 用来区别不同的 ASN.1 类型.

    四种 class:

  • Universal: 用来表示在所有应用中都具有相同意义的类型. 这些类型定义在 X.208
  • Application: 用来表示针对于具体应用的类型. 在不同的应用中这些类型的意义往往不同
  • Private: 用来表示针对用于具体企业的类型
  • Context-specific: 用来表示针对于具体上下文该类型意义会变化的类型
  • 列出这些类型仅供参考, 其在网络协议中往往应用较少. 因为具体的协议往往会规定某个数据的具体ASN.1结构. 对于每个数据的每个字段也都有严格的规定.

    Tag Numbers:

    TypeTag Number (decimal)Tag Number (hexadecimal)
    INTEGER202
    BIT STRING303
    OCTET STRING404
    NULL505
    OBJECT IDENTIFIER606
    SEQUENCE and SEQUENCE OF1610
    SET and SET OF1711
    PrintableString1913
    T61String2014
    IA5String2216
    UTCTime2317

    下面我们详细介绍每一种类型. 我们的目标是通过本文的描述,我们可以手工的解析一个X509证书.

    -----BEGIN CERTIFICATE-----
    MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
    A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
    b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
    MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
    YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
    aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
    jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
    xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
    1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
    snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
    U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
    9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
    BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
    AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
    yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
    38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
    AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
    DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
    HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
    -----END CERTIFICATE-----
    

    常用数据类型

    简单类型

    TypeDescrption
    BIT STRING由任意的 0 和 1 构成的字符串
    IA5String任意的 ASCII 字符串
    INTEGER任意的整型
    NULL表示空值
    OBJECT IDENTIFIER由一系列的整型序列组成
    OCTET STRING由八比特值构成的字符串, 类似于比特数组
    PrintableString由任意的可打印字符构成的字符串
    T61String由八比特字符构成的字符串
    UTCTimeGMT 时间值

    结构类型

    TypeDescrption
    SEQUENCE一个有序的类型集合
    SEQUENCE OF一个给定类型的有序集合
    SET一个无序的类型集合
    SET OF一个给定类型的无序集合

    结构类型中可以包含可选的部分, 可选部分也可以有默认值.

    Basic Encoding Rules

    Basic Encoding Rules 简称为 BER, 规定了如何将 ASN.1 值表示为比特数组.

    针对不同给数据类型, BER 规定了如下三种编码方法: Primitive, definte-length encoding, Contructed, definite-length encoding, Constructed, indefinite-length encoding.

    BER 编码包含以下部分:

  • Identifier octets: 由类型的 class 和 tag number 构成. 用来声明该类型是基本类型还是结构化类型.
  • Length octets: 对于定长编码方法, 该部分给定 content 的长度. 对于不定长编码方法, 该部分指明该类型是不定长的.
  • Contents octets: 对于基本类型, 这部分包含对应数据的字节表示. 对于复杂类型, 这部分包含了该数据的 BER 编码结果.
  • End-of-contents octets: 对于不定长编码方法, 该部分标识 content 的结束. 其他编码方法, 这部分省略.
  • 下面我们学习一下上述三种编码方法:

    1. Primitive, definte-length encoding
      基本数据类型除字符串类型外均使用这种编码方式. 这种情况下我们的数据编码结果会是以下形式:
      在这里插入图片描述
      其中不包含 End-of-contents 部分, 因为这里我们使用定长编码.

      对于 Identifier, 有两种形式:

      low tag number form: 这种形式下, Identifier 仅用一个字节表示. bit8 和 bit7 用来表示 class, bit6 为 0, 用来表示是基本类型. bit5-1表示 tag number.

      high tag number form: 这种形式下, Identifier 会占用一到多个字节. 第一个字节任然是 low tag number form 形式. 但是 bit5-1 应该全为 1. 其余比特用来表示 tag number, 高字节在前.

      ClassBit 8Bit 7
      Universal00
      Application01
      Context-specific10
      Private11

      对于 Length, 也有两种形式:

      Short form: 这种形式下, Length 占用一个字节. bit 8 为 0, 其余七字节用于编码长度, 因此这种形式用于表示长度 0-127.

      Long form: 这种形式下, Length 占用的字节长度为 2-127 个字节. 第一个字节的 bit8 为 1, 其余字节用于表示紧接着有多少个字节用来编码长度. 高字节在前.

    2. Contructed, definite-length encoding
      这种编码方法用于编码复杂类型和简单类型中的字符串类型且编码长度已知.编码形式与 Primitive, definte-length encoding 类似. 除了 Identifier 字段的第一个字节的 bit6 为 1, 用来表示是复杂类型.

    3. Constructed, indefinite-length encoding
      这种编码方法用于编码复杂类型和简单类型中的字符串类型且编码长度未知.编码形式如下:
      在这里插入图片描述
      这里 Length 字段的值为 0x80, End-of-contents 字段的值为两个字节的 0. 表示该编码方式为不定长编码.其余字段的编码与 Contructed, definite-length encoding 类似.

    Distinguished Encoding Rules

    Distinguished Encoding Rules 简称为 DER, 是 DER 编码的一个子集. 区别在于 BER 编码结果不唯一, 而 DER 编码结果唯一.

    DER 编码在 BER 编码的规则之上添加了如下限制:

  • 当编码长度在 0-127 之间时, 必须使用 short form 形式编码 Length 字段
  • 当编码长度大于 128 时, 必须使用 long form 形式且应使用最少的字节对长度进行编码,也就是说如果长度为192, 那么 Length 字段只能占两个字节. 第一个字节为0x81, 表示 Length 字段使用 Long form, 且紧接着只有一个字节用于编码长度信息. 第二个字节为 0xc0, 用来表示长度为 192
  • 对于简单字符串类型, 必须使用 primitive, definite-length 进行编码
  • 对于复杂类型, 必须使用 constructed definite-length 进行编码
  • 编码示例

    BIT STRING

    对 “00000110011011100101110111000000” 进行编码,

    对于 BIT STRING 类型, Identifier 字段应该为 03(这里我们不考虑 class, 仅仅考虑 tag number). 对于 Length 字段, 因为每个1或者0代表一个bit, 因此该值需要 4 字节进行编码, 因此 Length 字段应该为 04.

    编码结果为:

    BER short form encoding/DER encoding: 03 04 06 6e 5d c0
    BER long form encoding: 03 81 04 06 6e 5d c0
    

    IA5String

    对 "test1@rsa.com" 进行编码, 编码结果为:

    BER short form encoding/DER encoding: 16 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d
    BER long form encoding: 16 81 0d 74 65 73 74 31 40 72 73 61 2e 63 6f 6d
    

    假设我们想将 "test1@rsa.com" 编码为一个 IA5String 的集合, 该集合中由三个 IA5String 构成: “test1”, “@”, “rsa.com”.

    这里我们要编码一个复杂类型, 那么 Identifier 的 bit6 应该为 1, 代表复杂类型. 而 IA5String 的 tag number 为 0x16, 因此 Identifier 的值应该为 0x36. 因此编码结果如下:

       36 13                         16 05 74 65 73 74 3116 01 4016 07 72 73 61 2e 63 6f 6d
    

    INTEGER

    对 0 进行编码, 编码结果如下: 02 01 00
    对 127 进行编码, 编码结果如下: 02 01 7F
    对 128 进行编码, 编码结果如下: 02 02 00 80

    NULL

    编码结果为: 05 0005 81 00

    OCTET STRING

    对 01 23 45 67 89 ab cd ef 进行编码, 编码结果如下: 04 08 01 23 45 67 89 ab cd ef

    UTCTime

    将要进行 ANS1 编码的 UTCTime 应该是以下形式之一:

    YYMMDDhhmmZ
    YYMMDDhhmm+hh'mm'
    YYMMDDhhmm-hh'mm'
    YYMMDDhhmmssZ
    YYMMDDhhmmss+hh'mm'
    YYMMDDhhmmss-hh'mm'where:YY is the least significant two digits of the year
    MM is the month (01 to 12)
    DD is the day (01 to 31)
    hh is the hour (00 to 23)
    mm are the minutes (00 to 59)
    ss are the seconds (00 to 59)
    Z indicates that local time is GMT, + indicates that local time is later than GMT, and - indicates that local time is earlier than GMT
    hh' is the absolute value of the offset from GMT in hours
    mm' is the absolute value of the offset from GMT in minutes
    

    对于时间 4:45:40 p.m. Pacific Daylight Time on May 6, 1991 进行编码,
    它的所有表示形式中存在以下两种:

    "910506164540-0700"
    "910506234540Z"
    

    对他们进行编码的结果为:

    17 11 39 31 30 35 30 36 31 36 34 35 34 30 2D 30 37 30 30
    17 0d 39 31 30 35 30 36 32 33 34 35 34 30 5a
    

    OBJECT IDENTIFIER

    一个 Object identifier 的含义是由 registration authorities 赋予的, 这里我们不多说. 列举一些 Oid 作为示例.

    Object identifier valueMeaning
    { 1 2 }ISOmember bodies
    { 1 2 840 }US (ANSI)
    { 1 2 840 113549 }RSA Data Security, Inc.
    { 1 2 840 113549 1 }RSA Data Security, Inc. PKCS
    { 2 5 }directory services (X.500)
    { 2 5 8 }directory services-algorithm

    如何编码呢 ?
    编码后的第一个字节的值为 40 * value1 + value2. (value1 要求是 0, 1 或者 2. value2 要求是 0-39.)
    接下来的 value3, value4, …, valuen 以 128 为 base 进行编码, 高字节在前. 每个数字编码后除了最后一个字节外其他字节的 bit8 均为 1.

    举个例子, 对 { 1 2 840 113549 } 进行编码:
    首先, 40 * 1 + 2 = 42. 因此编码后第一个自己应该为 0x2a. 840 = 6 * 128 + 72. 因此 第二字节应该编码的值是 6 且 bit8 为 1, 因此第二位 0x86. 72 编码为第三字节, 为 0x48. 113549 = 6 * 1282 + 0x77 * 128 + 0x0d. 因此编码之后应该为 0x86, 0xF7, 0x0d.
    因此,最终编码结果为 06 06 2a 86 48 86 f7 0d.

    编码 Name (X.501 type)

    这一节, 我们试着来对 Name 类型进行 ASN.1 编码.

    Name 类型的 ASN.1 描述如下:

    Name ::= CHOICE {RDNSequence }RDNSequence ::= SEQUENCE OF RelativeDistinguishedNameRelativeDistinguishedName ::=SET OF AttributeValueAssertionAttributeValueAssertion ::= SEQUENCE {AttributeType,AttributeValue }AttributeType ::= OBJECT IDENTIFIERAttributeValue ::= ANYX.502 中定义 AttrubteType 可以有以下值:attributeType OBJECT IDENTIFIER ::={ joint-iso-ccitt(2) ds(5) 4 }countryName OBJECT IDENTIFIER ::= { attributeType 6 }organizationName OBJECT IDENTIFIER ::={ attributeType 10 }commonUnitName OBJECT IDENTIFIER ::={ attributeType 3 }
    

    下面我们来一步一步的编码!

    1. AttributeType
      上述 countryName, organizationName, commonName 的值均为 OCTET STRING. 因此他们的 DER 编码方法应该为 primitive, definite-length. 对于 OBJECT IDENTIFIER 类型, Identifier 字段应该为 06. bit8 和 bit7 为 0, 代表 Universal class. 他们的 Oid 分别为 { 2 5 4 6 }, { 2 5 4 10}, { 2 5 4 3}. 因此编码分别为:

      06 03 55 04 06   // countryName
      06 03 55 04 0a   // organizationName
      06 03 55 04 03   // commonName
      
    2. AttributeValue
      假设上述 countryName, organizationName, commonName 属性的值类型均为 PrintableString, 且值分别为 “US”, “Example Organization”, “Test User 1”.
      编码结果分别为:

      13 02 55 53  // "US"
      13 14 45 78 61 6d 70 6c 65 20 4f 72 67 61 6e 69 7a 61 74 69 6f 6e // "Example Organization"
      13 0b 54 65 73 74 20 55 73 65 72 20 31 // "Test User 1"
      
    3. AttributeValueAssertion
      AttributeValueAssertion 是 AttributeType 和 AttributeValue 的有序集合.
      编码结果如下:

      30 09           // countryName = "US"
      06 03 55 04 06
      13 02 55 53 
      30 1b           // organizationName = "Example Organization"
      06 03 55 04 0a
      13 14 45 78 61 6d 70 6c 65 20 4f 72 67 61 6e 69 7a 61 74 69 6f 6e
      30 12          // commonName = "Test User 1"
      06 03 55 04 0b
      13 0b 54 65 73 74 20 55 73 65 72 20 31
      
    4. RelativeDistinguishedName
      RelativeDistinguishedName 是 AttributeValueAssertion 的无序集合.
      编码结果如下, 为了直观, 我们省略了部分编码结果, 该结果均为上述步骤编码所得.

      31 0b
      30 09 ... 55 5331 1d
      30 1b ... 6f 6e31 14
      30 12 ... 20 31
      
    5. RDNSequence
      RDNSequence 是 RelativeDistinguishedName 的有序集合.
      编码结果如下:

      30 42
      31 0b ... 55 53
      31 1d ... 6f 6e
      31 14 ... 20 31
      
    6. Name
      Name 的值是一个 CHOICE 类型. 编码结果如下:

      
      30 4231 0b30 09                                   06 03 55 04 06 // attributeType = countryName           13 02 55 53 // attributeValue = "US"31 1d30 1b06 03 55 04 0a // attributeType = organizationName                 13 14 45 78 61 6d 70 6c 65 20 4f 72 67 67 61 6e 69 7a 61 74 69 6f 6e  // attributeValue = "Example Organization"31 1430 1206 03 55 04 03 // attributeType = commonName                   13 0b 54 65 73 74 20 55 73 65 72 20 31 // attributeValue = "Test User 1"

    Ending.

    最后分享一个好用的在线解析 ASN.1 的工具: https://lapo.it/asn1js/.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

证书体系: PFX 文件格式解析

原文同时发布于本人个人博客: https://kutank.com/blog/cert-pfx/ 章节目录 PFX 简介PFX 格式解析 2.1 最外层结构 2.2 AuthenticatedSafe 结构 参考 https://tools.ietf.org/html/rfc7292. PFX 简介## 以下引用自维基百科 在密码学中,PKCS #12 定义了…

C10K 非阻塞 Web 服务器

本文由作为 Going Concurrency in Go 的作者 Nathan Kozyra 撰写, 解决了互联网上最著名,最受尊敬的挑战之一, 并试图通过核心 Go 包来解决它. 原文地址: https://hub.packtpub.com/c10k-non-blocking-web-server-go/ 我们已经构建了一些可用的应用程序,并且可以在日常使用的真…

SHA算法描述及实现

SHA 算法的原理及实现 章节目录 简介算法描述 2.1 数据准备 2.1.1 <数据填充 2.1.2 数据分块 2.1.3 设置初始 Hash 值 2.2 Hash 计算 2.2.1 SHA-1 2.2.2 SHA-256 2.2.3 SHA-512实现<b>作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, …

C 语言笔记: 链表节点实现技巧--struct的妙用

链表节点实现技巧–struct的妙用 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 废话 C 语言虽然只提供了非常简单的语法&#xff0c;但是丝毫不影响 C 语言程序员使用 C 来实现很多让人叹为观止的高级功能…

协议簇: Media Access Control(MAC) Frame 解析

Media Access Control(MAC) Frame 解析 前言 千里之行&#xff0c;始于足下。 因为个人从事网络协议开发&#xff0c;一直想深入的学习一下协议族&#xff0c;从这篇开始&#xff0c;我将开始记录分享我学习到的网络协议相关的知识 简介 引用百度百科的描述&#xff1a; 数…

协议簇:Ethernet Address Resolution Protocol (ARP) 解析

简介 前面的文章中&#xff0c;我们介绍了 MAC Frame 的帧格式。我们知道&#xff0c;在每个 Ethernet Frame 中都分别包含一个 48 bit 的源物理地址和目的物理地址. 对于源地址很容易理解&#xff0c;该地址可以直接从硬件上读取. 但是对于一个网络节点&#xff0c;他怎么知道…

协议簇:IPv4 解析

简介 IP 是一种无连接的协议. 操作在使用分组交换的链路层&#xff08;如以太网&#xff09;上。此协议会尽最大努力交付数据包。 尽最大努力意味着&#xff1a; IP 协议不保证数据的可靠传输, 没有流量控制机制, 不保证传输序列(意味着 IP 数据包会在传输过程中乱序), 没有…

协议簇:ICMP 解析

简介 ICMP 是 Internet Control Message Protocol 的简写. 它主要用来调试网络通信环境中存在的问题. 比如&#xff0c;当 IP 数据包总是无法正常的发送到目的地址, 当网关没有足够的 buffer 来转发对应的数据包 等问题. 值得一提的是&#xff0c;它属于网络层&#xff0c;不属…

协议簇:TCP 解析: 基础

简介 本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的&#xff0c;不会互相冲突. 系列文章 协议簇&#xff1a;TCP 解析&#xff1a;基础 协议簇&#xff1a;TCP 解析&#xff1a;建立连接 协议…

协议簇:TCP 解析: 建立连接

简介 接前文 协议簇&#xff1a;TCP 解析: 基础&#xff0c; 我们这篇文章来看看 TCP 连接建立的过程&#xff0c;也就是众所周知的”三次握手“的具体流程. 系列文章 协议簇&#xff1a;TCP 解析&#xff1a;基础 协议簇&#xff1a;TCP 解析&#xff1a;建立连接 协议簇&a…

协议簇:TCP 解析: 连接断开

简介 接前文 协议簇&#xff1a;TCP 解析: 建立连接&#xff0c; 我们这篇文章来看看 TCP 连接断开的过程&#xff0c;也就是众所周知的”四次挥手“的具体流程. 系列文章 协议簇&#xff1a;TCP 解析&#xff1a;基础 协议簇&#xff1a;TCP 解析&#xff1a;建立连接 协议…

协议簇:TCP 解析: Sequence Number

简介 序列号&#xff08;Sequence Number&#xff09; 是 TCP 协议中非常重要的一个概念&#xff0c;以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中&#xff0c;通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启&#xff0c;状态为 active 如果未开启&#xff0c;状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里&#xff0c;我…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候&#xff0c;我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题&#xff1a; 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候&#xff0c;发现连接速度非常慢&#xff08;肉眼可见的慢&#x…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客&#xff1a; https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识&#xff0c;重点集中在 CSR 所包含的信息&#xff0c;及其意义。 CSR 的作用: CSR 通常由想要获…

模拟网页行为之工具篇二

先说360浏览器&#xff0c;打开开发者选项&#xff0c;可以看到界面提供了几个功能选项&#xff0c;如图&#xff1a; 这个图片的第一个搜索图标点中过后&#xff0c;再去选中网页你感兴趣的部分就可以在Element选项中跳转到你感兴趣的代码。也可以直接ctrlF2搜寻你感兴趣网页元…

模拟网页行为之实践篇三

现在来谈下验证码图片的获取方式&#xff0c;带有验证码的地方都会附带有个刷新按钮&#xff0c;而刷新按钮的地方就是获取验证码网址代码。如果看过前面写的《模拟网页行为之工具篇》就会很容易定位到代码位置。定位到代码位置后看下图&#xff1a; 基本可以看到的是获取验证码…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit&#xff0c;输入按512-bit 分组进行处理&#xff0c;产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步&#xff1a; STEP1&#xff1a;附加填充比特。对报文进行填充使报文长度与448 模512 同余&#xff08;长度…