如何获取DER结构的大小?用于提取密文文件中的密文
解析DER头部长度以提取密文的方法
DER序列长度的核心解析规则
你的Header是外层嵌套的ASN.1序列,DER编码后开头固定是0x30(序列的标签字节),紧随其后的是长度字段,分两种格式:
- 短格式:当序列内容长度≤127时,长度字段占1字节,最高位为0,剩余7位直接表示内容长度。比如长度为20,对应字节是
0x14。 - 长格式:当内容长度>127时,长度字段第一个字节最高位为1,剩余7位表示后续存储实际长度的字节数。比如
0x82表示后面2个字节是长度值,将这两个字节按大端拼接成整数就是内容长度。
整个DER头部的总长度 = 标签字节(1字节) + 长度字段的总字节数 + 内容长度(长度字段指向的数值)
具体操作步骤
- 读取文件起始字节:以二进制模式打开密文文件,先读取前9个字节(DER长度字段最多占1+8=9字节,足够覆盖所有情况)。
- 验证序列标签:确认第一个字节是
0x30,确保是你定义的外层ASN.1序列。 - 解析长度字段:
- 取第二个字节
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 + 内容长度。
- 若
- 取第二个字节
- 提取密文:将文件指针移动到头部总长度的位置,之后读取的所有内容就是需要解密的密文。
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
相关产品推荐
相关产品推荐

