首页 > 解决方案 > 反向解码base45

问题描述

有一个程序可以在 python 中解码文本。我希望使用相同的方法对输出 tekst 进行编码。

代码是一个解码工具。所以我想如果您以其他方式使用代码,您可以对其进行编码。但是由于我不了解代码本身,因此无法反转代码。因此,如果有人可以帮助我翻转代码,以便您可以再次对输出进行编码,那就太好了。

../samples/bartwolff.txt

NL2:B4V.W9D:LWJ5W2S6A$XQ9N* Y252O4%%  ZNK**$840VPY8T7$J0GR$8L2%VMO/20/3C.C.L XO:FN%IWW.TI+G3KW2RA+ $6T1 BQAGU6HJ35D.2YPIT*6Y3C733IOBZIKEWP4L/$9TX6QUVQFFZWJ+RY/JV6N3%NX%Y4XX43J182O/.AELM1%E-D*Q+8*O1CG*9/5ENUJ0HXT*PJXJ*XE-6QFMM7*B$IFEY04:-PN14PX3% Q5-JQF9$YJFVBSUD*P/AXHJRNUIA:SCX*SBIQ*BHZG$PJ+LG-S*:0.GZ8M4HO.XLM$BKZG7H/BVRUW$7WH$B3$L-T58KK$20EDRZW1B*VJ1Q5VC:X/.5*OQJ/EA92-8J*-QL6J+3NX:C5%%XZ4LLIS31KKPA9:1FP++KT:.QFRZ%M5R$I2*DM36M%BW/3.LS9MX6YE8KU4S-.Q%W2ZCI7CQ79E/X342+5T3ODK8X.-F02J-GMF18KCE.5NDV2V8I/5L0GVNPQRF+T3A*$%HI3-$R3+*RO/X8N.RG7LBFJP5SO9QAD:KYRP978DTHFL39368JXWSO2CKLQTYDZ45CF0FE9J3$$6+ZX RSNRQ6+HV%DE$V:O/Q8FYO+.NZFL6R8R8UE.0:A*Q9$8HYB+WZ26UM%.4R4 25AA7XQW.NYAJCO6+-C QZEPKLYS6G0Z/YGHPR*+YKEDO*3LE:KP HT3NCJPRNRG9K0Y84*C-7N2-BQJXY/+D-VF IIQTJ6-AV83%1Y8JMXN1I6/JSHS+HEG+VU+8UX:LL*Y%B*$G$D4H9HZVMHKWT2-87UTR+EZIWJ*IOTQ70.V%CLHVY  2-HFW4BA6-+FWIW6C:WDS /FU2I9G$LXL$B/MY*WQYMN*R00IQZJJ- 6QFX*$%-9ZGS3%G

输出是:

Version and public cert for verification:
[b'\x02', 'VWS-CC-1']

QR data
{
    "isSpecimen": "1",
    "isPaperProof": "1",
    "validFrom": "1627466400",
    "validForHours": "25",
    "firstNameInitial": "B",
    "lastNameInitial": "B",
    "birthDay": "31",
    "birthMonth": "7"
}

源代码:

import asn1
import base45
import sys
from typing import List, Dict, Optional
from var_dump import var_dump
import json

# Thanks to the great work of Bart Wollf


def asn1decode(d: asn1.Decoder):
    res = []
    while not d.eof():
        tag = d.peek()
        if tag.typ == asn1.Types.Primitive:
            tag, value = d.read()
            res.append(value)
        elif tag.typ == asn1.Types.Constructed:
            d.enter()
            res.append(asn1decode(d))
            d.leave()
    return res

class NLDomesticCovidCertSerialization:
    DisclosureTimeSeconds: int
    C: int
    A: int
    EResponse: int
    VResponse: int
    AResponse: int
    ADisclosed: List[int]

    def __init__(self, data: List):
        self.DisclosureTimeSeconds = data[0]
        self.C = data[1]
        self.A = data[2]
        self.EResponse = data[3]
        self.VResponse = data[4]
        self.AResponse = data[5]
        self.ADisclosed = data[6]

    def decode_metadata(self) -> List:
        b = NLDomesticCovidCertSerialization.decode_int(self.ADisclosed[0])
        d = asn1.Decoder()
        d.start(b)
        return asn1decode(d)[0]

    def decode_attributes(self) -> Dict[str, str]:
        res = {}
        attrs = ['isSpecimen',
            'isPaperProof',
            'validFrom',
            'validForHours',
            'firstNameInitial',
            'lastNameInitial',
            'birthDay',
            'birthMonth']
        for i, x in enumerate(self.ADisclosed[1:]):
            res[attrs[i]] = NLDomesticCovidCertSerialization.decode_int(x).decode('utf-8')
        return res

    @staticmethod
    def decode_int(value: int) -> Optional[bytes]:
        if not value & 1:
            return None
        else:
            v = value >> 1
            return v.to_bytes((v.bit_length() + 7) // 8, byteorder='big')

def main():
    with open("../samples/bartwolff.txt") as handle:
        s = handle.readline().rstrip()

    b45data = s[4:]
    asn1data = base45.b58decode(b45data)

    decoder = asn1.Decoder()
    decoder.start(asn1data)

    obj = asn1decode(decoder)[0]

    annotator = NLDomesticCovidCertSerialization(obj)
    print("Version and public cert for verification:")
    print(annotator.decode_metadata())

    print("\nQR data")
    print(json.dumps(annotator.decode_attributes(), indent=4))

if __name__ == '__main__':
    main()

标签: pythonencodingbase45

解决方案


我也在研究解码的事情。在其中的一个文件中,我看到了 asn1.Unmarshal,它出现在 base45.Base45Decode(https://github.com/minvws/nl-covid19-coronacheck-idemix/blob/main/verifier/verifier.go)之后。你正在做一个base45.b58decode,然后是一个asn1.decoder,不能想象它们是一样的吗?


推荐阅读