當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Ruby ASN1模塊用法及代碼示例

本文簡要介紹ruby語言中 OpenSSL::ASN1模塊 的用法。

抽象語法符號一(或 ASN.1)是一種用於說明數據結構的符號語法,在ITU-T X.680 中定義。 ASN.1 本身不要求任何編碼或解析規則,但通常 ASN.1 數據結構使用 Distinguished Encoding 規則 (DER) 或較少使用 ITU-T X 中說明的基本 Encoding 規則 (BER) 進行編碼.690。 DER 和 BER 編碼是二進製 Tag-Length-Value (TLV) 編碼,與 XML、 JSON 等其他流行的數據說明格式相比非常簡潔。ASN.1 數據結構在密碼應用程序中非常常見,例如X.509 公鑰證書或證書撤銷列表 (CRL) 都在 ASN.1 和 DER-encoded 中定義。 ASN.1、DER 和 BER 是應用密碼學的構建塊。 ASN1 模塊提供了允許生成 ASN.1 數據結構的必要類以及使用 DER 編碼對其進行編碼的方法。 decode 方法允許將任意 BER-/DER-encoded 數據解析為 Ruby 對象,然後可以隨意修改和重新編碼。

ASN.1 類層次結構

表示 ASN.1 結構的基類是 ASN1Data ASN1Data 提供讀取和設置特定 ASN.1 項的 tagtag_class 以及最後的 value 的屬性。解析時,任何標記值(隱式或顯式)都將由 ASN1Data 實例表示,因為它們的 “real type” 隻能使用 ASN.1 類型聲明中的帶外信息來確定。由於在編碼類型時通常已知此信息,因此 ASN1Data 的所有子類都提供附加屬性 tagging,允許隱式 ( :IMPLICIT ) 或顯式 ( :EXPLICIT ) 編碼值。

Constructive

顧名思義, Constructive 是所有構造編碼的基類,即由多個值組成的編碼,與隻有一個值的 “primitive” 編碼相反。 Constructive 的值始終是 Array

ASN1::Set 和 ASN1::Sequence

最常見的構造編碼是 SET 和 SEQUENCE,這就是為什麽有兩個 Constructive 的子類代表它們中的每一個。

Primitive

這是所有原始值的超類。 Primitive 本身在解析 ASN.1 數據時不使用,所有值或者是 Primitive 的相應 sub-class 的實例,或者是 ASN1Data 的實例,如果該值被隱式或顯式標記。請參考。 Primitive 文檔,了解有關子類及其從 ASN.1 數據類型到 Ruby 對象的映射的詳細信息。

tagging 的可能值

在構造 ASN1Data 對象時,ASN.1 類型定義可能需要隱式或顯式標記某些元素。這可以通過為 ASN1Data 的子類手動設置 tagging 屬性來實現。使用符號:IMPLICIT 進行隱式標記,如果元素需要顯式標記,則使用:EXPLICIT

tag_class 的可能值

可以創建任意的 ASN1Data 對象,這些對象也支持 PRIVATE 或 APPLICATION 標記類。 tag_class 屬性的可能值為:

  • :UNIVERSAL(未標記值的默認值)

  • :CONTEXT_SPECIFIC(標記值的默認值)

  • :APPLICATION

  • :PRIVATE

標記常量

每個通用標簽都定義了一個常量:

  • OpenSSL::ASN1::EOC (0)

  • OpenSSL::ASN1::BOOLEAN (1)

  • OpenSSL::ASN1::整數 (2)

  • OpenSSL::ASN1::BIT_STRING (3)

  • OpenSSL::ASN1::OCTET_STRING (4)

  • OpenSSL::ASN1::NULL (5)

  • OpenSSL::ASN1::OBJECT (6)

  • OpenSSL::ASN1::枚舉 (10)

  • OpenSSL::ASN1::UTF8STRING (12)

  • OpenSSL::ASN1::SEQUENCE (16)

  • OpenSSL::ASN1::SET (17)

  • OpenSSL::ASN1::NUMERICSTRING (18)

  • OpenSSL::ASN1::PRINTABLESTRING (19)

  • OpenSSL::ASN1::T61STRING (20)

  • OpenSSL::ASN1::VIDEOTEXSTRING (21)

  • OpenSSL::ASN1::IA5STRING (22)

  • OpenSSL::ASN1::UTCTIME (23)

  • OpenSSL::ASN1::GENERALIZEDTIME (24)

  • OpenSSL::ASN1::圖形字符串 (25)

  • OpenSSL::ASN1::ISO64STRING (26)

  • OpenSSL::ASN1::GENERALSTRING (27)

  • OpenSSL::ASN1::UNIVERSALSTRING (28)

  • OpenSSL::ASN1::BMPSTRING (30)

UNIVERSAL_TAG_NAME 常數

Array 存儲給定標簽號的名稱。這些名稱與另外定義的標簽常量的名稱相同,例如+ UNIVERSAL_TAG_NAME = “INTEGER”+ 和 +OpenSSL::ASN1::INTEGER = 2+。

示例用法

解碼和查看 DER-encoded 文件

require 'openssl'
require 'pp'
der = File.binread('data.der')
asn1 = OpenSSL::ASN1.decode(der)
pp der

創建一個 ASN.1 結構並 DER-encoding 它

require 'openssl'
version = OpenSSL::ASN1::Integer.new(1)
# Explicitly 0-tagged implies context-specific tag class
serial = OpenSSL::ASN1::Integer.new(12345, 0, :EXPLICIT, :CONTEXT_SPECIFIC)
name = OpenSSL::ASN1::PrintableString.new('Data 1')
sequence = OpenSSL::ASN1::Sequence.new( [ version, serial, name ] )
der = sequence.to_der

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 ASN1模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。