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

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()方法的输出会不一样。

这是我想要实现的可视化效果截图:
CLI输出

备注:内容来源于stack exchange,提问作者Akin Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:09:35