DER签名序列化可视化输出缺失00前缀问题求助
DER签名序列化可视化输出缺失00前缀问题求助
我正在开发一个数据序列化的库,遇到了一个问题:当我尝试可视化序列化结果时,得到的输出和无格式的原始序列化结果不一致。
# ansi colour codes g='\033[0;32m' lp='\033[1;35m' lc='\033[1;36m' y='\033[1;33m' r='\033[0m' bb='\033[1;94m' gr='\033[1;90m' bc='\033[1;96m' re='\033[1;31m' rb='\033[1;91m' w='\033[1;97m' class Signature: def __init__(self, r_x, value): self.r_x = r_x self.value = value def der(self, display=False): if not display: rxbin = self.r_x.to_bytes(32, 'big') # removing all null bytes rxbin = rxbin.lstrip(b"\x00") # if rxbin has high bit add \x00 if rxbin[0] & 0x80: rxbin = b'\x00' + rxbin result = bytes([2, len(rxbin)]) + rxbin sigbin = self.value.to_bytes(32, 'big') sigbin = sigbin.lstrip(b"\x00") if sigbin[0] & 0x80: sigbin = b'\x00' + sigbin result += bytes([2, len(sigbin)]) + sigbin return bytes([0x30, len(result)]) + result else: rxbin = self.r_x.to_bytes(32, 'big') # removing all null bytes rxbin = rxbin.lstrip(b"\x00") # if rxbin has high bit add \x00 if rxbin[0] & 0x80: rxbin = b'\x00' + rxbin r_x_value = lp + f"{hex(int.from_bytes(rxbin, 'big'))}".lstrip("0x") + r r_x_length = lc + f"{hex(len(rxbin))}".lstrip('0x') + r r_prefxbyte = re + f"02" + r # b'\x02' result = bytes([2, len(rxbin)]) + rxbin sigbin = self.value.to_bytes(32, 'big') sigbin = sigbin.lstrip(b"\x00") if sigbin[0] & 0x80: sigbin = b'\x00' + sigbin result += bytes([2, len(sigbin)]) + sigbin sig_value = y + f"{hex(int.from_bytes(sigbin, 'big'))}".lstrip("0x") + r sig_length = gr + f"{hex(len(sigbin))}".lstrip('0x') + r sig_prefxbyte = bb + "02" + r prefix = g + f"{hex(0x30)}".lstrip("0x") + r + w + f"{hex(len(result))}".lstrip("0x") + r print() print("Distinguished encoding representation for signatures in hex base. der signature serialization:") print() print(prefix + r_prefxbyte +r_x_length + r_x_value + sig_prefxbyte + sig_length+ sig_value ) print() print("key:") print(g + "Signature prefix "+ r ) print(w+ "Length of complete signature" + r) print(y + "signature value " + r ) print(gr + "signature length " + r ) print(bb + "signature prefix " + r ) print(lc + "r_x length " + r ) print(lp + "r_x value " + r ) print(re + "r_x prefix " + r ) print()
我在.der()方法里加了if-else语句来辅助可视化序列化过程。
使用以下测试值:
r = 0x37206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c6 s = 0x8ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
当使用原始的.der()方法(不启用display)时,得到的序列化结果是正确的:
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c60221008ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
但带颜色的可视化版本结果却有差异:
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c602218ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
差异点在于:签名值长度和实际签名值之间缺少了00前缀。
正确序列化结果:
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c60221008ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
带颜色的序列化结果(缺失00):
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c602218ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
我反复检查了实现,但找不到为什么可视化打印版本和原始.der()方法的输出会不一样。
这是我想要实现的可视化效果截图:
备注:内容来源于stack exchange,提问作者Akin Wilson
相关产品推荐
相关产品推荐

