động cơ mã hóa

Như với các tiêu chuẩn, ASN.1 và mã hóa là độc lập. Chúng tôi đã thấy được cách để tạo ra một đối tượng ASN.1 hữu vi. Để mã hóa hoặc giải mã nó, chúng ta cần phải chọn một quy tắc mã hóa. Scapy chỉ cung cấp BER cho thời điểm này (thực ra, nó có thể là DER. DER trông giống như BER trừ chỉ mã hóa tối thiểu được ủy quyền mà cũng có thể là những gì tôi đã làm). Tôi gọi đây là một codec ASN.1.
Mã hóa và giải mã được thực hiện bằng phương pháp lớp học được cung cấp bởi các codec. Ví dụ lớp BERcodec_INTEGER cung cấp một .enc () và một .dec () phương pháp lớp học mà có thể chuyển đổi giữa một chuỗi mã hóa và một giá trị kiểu của họ. Tất cả họ đều kế thừa từ BERcodec_Object có khả năng giải mã các đối tượng từ bất kỳ loại:

>>> BERcodec_INTEGER.enc(7)
'\x02\x01\x07'
>>> BERcodec_BIT_STRING.enc("egg")
'\x03\x03egg'
>>> BERcodec_STRING.enc("egg")
'\x04\x03egg'
>>> BERcodec_STRING.dec('\x04\x03egg')
(<ASN1_STRING['egg']>, '')
>>> BERcodec_STRING.dec('\x03\x03egg')
Traceback (most recent call last):
  File "<console>", line 1, in ?
  File "/usr/bin/scapy", line 2099, in dec
    return cls.do_dec(s, context, safe)
  File "/usr/bin/scapy", line 2178, in do_dec
    l,s,t = cls.check_type_check_len(s)
  File "/usr/bin/scapy", line 2076, in check_type_check_len
    l,s3 = cls.check_type_get_len(s)
  File "/usr/bin/scapy", line 2069, in check_type_get_len
    s2 = cls.check_type(s)
  File "/usr/bin/scapy", line 2065, in check_type
    (cls.__name__, ord(s[0]), ord(s[0]),cls.tag), remaining=s)
BER_BadTag_Decoding_Error: BERcodec_STRING: Got tag [3/0x3] while expecting <ASN1Tag STRING[4]>
### Already decoded ###
None
### Remaining ###
'\x03\x03egg'
>>> BERcodec_Object.dec('\x03\x03egg')
(<ASN1_BIT_STRING['egg']>, '')

đối tượng ASN.1 được mã hóa sử dụng phương pháp của họ .enc (). Phương pháp này phải được gọi với các codec chúng tôi muốn sử dụng. Tất cả các codec được tham chiếu trong các đối tượng ASN1_Codecs. str () cũng có thể được sử dụng. Trong trường hợp này, các codec mặc định (conf.ASN1_default_codec) sẽ được sử dụng.

>>> x.enc(ASN1_Codecs.BER)
'0\r\x02\x01\x07\x04\x03egg0\x03\x01\x01\x00'
>>> str(x)
'0\r\x02\x01\x07\x04\x03egg0\x03\x01\x01\x00'
>>> xx,remain = BERcodec_Object.dec(_)
>>> xx.show()
# ASN1_SEQUENCE:
  <ASN1_INTEGER[7L]>
  <ASN1_STRING['egg']>
  # ASN1_SEQUENCE:
    <ASN1_BOOLEAN[0L]>

>>> remain
''

Theo mặc định, giải mã được thực hiện bằng cách sử dụng lớp Universal, có nghĩa là đối tượng được định nghĩa trong lớp Context sẽ không thể được giải mã. Có một lý do chính đáng cho rằng: việc giải mã phụ thuộc vào ngữ cảnh!


Các lớp Context phải được xác định:


lớp ASN.1
Trong khi điều này có thể được tốt đẹp, nó chỉ có một ASN.1 bộ mã hóa / giải mã. Không có gì liên quan đến Scapy nào.
lĩnh vực ASN.1
Scapy cung cấp các lĩnh vực ASN.1. Họ sẽ quấn đối tượng ASN.1 và cung cấp logic cần thiết để ràng buộc một tên trường để các giá trị. các gói dữ liệu ASN.1 sẽ được mô tả như là một cây của các lĩnh vực ASN.1. Sau đó, mỗi tên trường sẽ được thực hiện như là một đối tượng gói bình thường, trong một hương vị phẳng (ví dụ: để truy cập trường phiên bản của một gói dữ liệu SNMP, bạn không cần phải biết làm thế nào nhiều container bọc nó).
Mỗi lĩnh vực ASN.1 được liên kết với một đối tượng ASN.1 thông qua thẻ của nó.
các gói dữ liệu ASN.1
các gói dữ liệu ASN.1 kế thừa từ các lớp Packet. Thay vì một danh sách fields_desc lĩnh vực, họ xác định ASN1_codec và ASN1_root thuộc tính. Người đầu tiên là một codec (ví dụ: ASN1_Codecs.BER), điều thứ hai là một cây hỗn hợp với các lĩnh vực ASN.1.

Comments

Popular posts from this blog

Thiết lập card không dây trên Kali Linux

Monitor mode

Giới thiệu - Scapy