You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取DER结构的大小?用于提取密文文件中的密文

解析DER头部长度以提取密文的方法

DER序列长度的核心解析规则

你的Header是外层嵌套的ASN.1序列,DER编码后开头固定是0x30(序列的标签字节),紧随其后的是长度字段,分两种格式:

  • 短格式:当序列内容长度≤127时,长度字段占1字节,最高位为0,剩余7位直接表示内容长度。比如长度为20,对应字节是0x14。
  • 长格式:当内容长度>127时,长度字段第一个字节最高位为1,剩余7位表示后续存储实际长度的字节数。比如0x82表示后面2个字节是长度值,将这两个字节按大端拼接成整数就是内容长度。

整个DER头部的总长度 = 标签字节(1字节) + 长度字段的总字节数 + 内容长度(长度字段指向的数值)


具体操作步骤

  1. 读取文件起始字节:以二进制模式打开密文文件,先读取前9个字节(DER长度字段最多占1+8=9字节,足够覆盖所有情况)。
  2. 验证序列标签:确认第一个字节是0x30,确保是你定义的外层ASN.1序列。
  3. 解析长度字段:
    • 取第二个字节len_byte:
      • 若len_byte < 0x80:内容长度就是len_byte,头部总长度 = 1 + 1 + len_byte = len_byte + 2。
      • 若len_byte >= 0x80:计算长度字节数n = len_byte & 0x7F,接着读取后续n个字节,将其按大端字节序转换为整数得到内容长度,头部总长度 = 1 + 1 + n + 内容长度。
  4. 提取密文:将文件指针移动到头部总长度的位置,之后读取的所有内容就是需要解密的密文。

Python代码示例

def get_der_header_length(file_path):
    with open(file_path, 'rb') as f:
        # 读取标签字节
        tag_byte = f.read(1)
        if tag_byte != b'\x30':
            raise ValueError("不是预期的ASN.1序列头部")
        
        # 读取长度字段第一个字节
        len_byte = ord(f.read(1))
        if len_byte < 0x80:
            content_len = len_byte
            header_total_len = 1 + 1 + content_len
        else:
            num_len_bytes = len_byte & 0x7F
            len_bytes = f.read(num_len_bytes)
            content_len = int.from_bytes(len_bytes, byteorder='big')
            header_total_len = 1 + 1 + num_len_bytes + content_len
        return header_total_len

# 使用示例
cipher_file = "your_cipher_file.bin"
header_len = get_der_header_length(cipher_file)
with open(cipher_file, 'rb') as f:
    f.seek(header_len)
    ciphertext = f.read()
    # 这里对ciphertext进行解密操作

内容的提问来源于stack exchange,提问作者proxy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:02:50