解码南非(ZA)驾照

13

我正在为iOS编写一个扫描南非驾照背面PDF417条形码(http://en.wikipedia.org/wiki/PDF417)的解决方案。我找不到任何关于如何解码条形码的文档或规范。有没有人有链接到可以解码存储在PDF417条形码中的驾驶执照数据的规范或示例代码?谢谢。


在谷歌上搜索“iOS条形码417”会出现几个选项。http://code.google.com/p/zxing/声称支持它。 - Jason
有人知道我们可以从条形码中获取哪些数据吗? - Zapnologica
2个回答

24
扫描PDF417条形码后的数据为720字节。前4个字节表示条形码的版本号。第二版涵盖所有当前有效的许可证。
版本1: 01 e1 02 45 版本2: 01 9b 09 45 接下来两个字节为零(00 00)。
剩下的714字节组成6个块——5个128字节块和1个74字节块。
根据版本和块大小使用不同的密钥。
版本1,128字节。
-----BEGIN RSA PUBLIC KEY-----
MIGXAoGBAP7S4cJ+M2MxbncxenpSxUmBOVGGvkl0dgxyUY1j4FRKSNCIszLFsMNw
x2XWXZg8H53gpCsxDMwHrncL0rYdak3M6sdXaJvcv2CEePrzEvYIfMSWw3Ys9cRl
HK7No0mfrn7bfrQOPhjrMEFw6R7VsVaqzm9DLW7KbMNYUd6MZ49nAhEAu3l//ex/
nkLJ1vebE3BZ2w==
-----END RSA PUBLIC KEY-----

版本 1,74 字节:

-----BEGIN RSA PUBLIC KEY-----
MGACSwD/POxrX0Djw2YUUbn8+u866wbcIynA5vTczJJ5cmcWzhW74F7tLFcRvPj1
tsj3J221xDv6owQNwBqxS5xNFvccDOXqlT8MdUxrFwIRANsFuoItmswz+rfY9Cf5
zmU=
-----END RSA PUBLIC KEY-----

版本2,128字节:

-----BEGIN RSA PUBLIC KEY-----
MIGWAoGBAMqfGO9sPz+kxaRh/qVKsZQGul7NdG1gonSS3KPXTjtcHTFfexA4MkGA
mwKeu9XeTRFgMMxX99WmyaFvNzuxSlCFI/foCkx0TZCFZjpKFHLXryxWrkG1Bl9+
+gKTvTJ4rWk1RvnxYhm3n/Rxo2NoJM/822Oo7YBZ5rmk8NuJU4HLAhAYcJLaZFTO
sYU+aRX4RmoF
-----END RSA PUBLIC KEY-----

版本2,74字节:

-----BEGIN RSA PUBLIC KEY-----
MF8CSwC0BKDfEdHKz/GhoEjU1XP5U6YsWD10klknVhpteh4rFAQlJq9wtVBUc5Dq
bsdI0w/bga20kODDahmGtASy9fae9dobZj5ZUJEw5wIQMJz+2XGf4qXiDJu0R2U4
Kw==
-----END RSA PUBLIC KEY-----

将每个块分开解密。使用公钥,用RSA ENCRYPT函数进行解密。


2
@DonaldJansen,你最终成功了吗?我在网上找了很久,想要从条形码中获取可读信息的方法。任何帮助都将不胜感激...即使只是指引正确方向的一点点提示。 - pjdupreez
2
@pjdupreez,你可以在MyBroadBand上找到足够的代码来帮助你入门。我已经成功地使用了以上的密钥。我想给你发电子邮件,但是你的个人资料没有显示你的电子邮件地址。 无论如何,这是链接 https://mybroadband.co.za/vb/showthread.php/382187-Decode-Drivers-Licence-Barcode - Donald Jansen
4
我遇到了一个带有头部“01 87 06 45”的新版本。有人有这个版本的密钥吗? - BW Müller
2
最近几个月有人成功地从编码中提取数据和图像吗? - pjdupreez
1
一旦它被解密,它也会被编码,因此您需要具备HEX值的经验。 - Donald Jansen
显示剩余9条评论

1
基于RSA公钥、不完整的文档C#开源项目,我已经成功地用Python解码了南非驾照,除了图像部分。

enter image description here

步骤:
  1. Load the RSA public key from the PEM format.
    pubKey = rsa.PublicKey.load_pkcs1(pk128)
    
  2. Decrypt the data decoded from PDF417:
     all = bytearray()
     pubKey = rsa.PublicKey.load_pkcs1(pk128)
     start = 6
     for i in range(5):
         block = data[start: start + 128]
         input = int.from_bytes(block, byteorder='big', signed=False)
         output = pow(input, pubKey.e, mod=pubKey.n)
    
         decrypted_bytes = output.to_bytes(128, byteorder='big', signed=False)
         all += decrypted_bytes
    
         start = start + 128
    
     pubKey = rsa.PublicKey.load_pkcs1(pk74)
     block = data[start: start + 74]
     input = int.from_bytes(block, byteorder='big', signed=False)
     output = pow(input, pubKey.e, mod=pubKey.n)
    
     decrypted_bytes = output.to_bytes(74, byteorder='big', signed=False)
     all += decrypted_bytes
    
  3. Parse the data:
    def parse_data(data):
    
        index = 0
        for i in range(0, len(data)):
            if data[i] == 0x82:
                index = i
                break
    
        # Section 1: Strings
        vehicleCodes, index = readStrings(data, index + 2, 4)
        print(f'Vehicle codes: {vehicleCodes}')
    
        surname, index, delimiter = readString(data, index)
        print(f'Surname: {surname}')
    
        initials, index, delimiter = readString(data, index)
        print(f'Initials: {initials}')
    
        PrDPCode = ''
        if delimiter == 0xe0:
            PrDPCode, index, delimiter = readString(data, index)
            print(f'PrDP Code: {PrDPCode}')
    
        idCountryOfIssue, index, delimiter = readString(data, index)
        print(f'ID Country of Issue: {idCountryOfIssue}')
    
        licenseCountryOfIssue, index, delimiter = readString(data, index)
        print(f'License Country of Issue: {licenseCountryOfIssue}')
    
        vehicleRestrictions, index = readStrings(data, index, 4)
        print(f'Vehicle Restriction: {vehicleRestrictions}')
    
    ...
    
您可以访问https://github.com/yushulx/South-Africa-driving-license/blob/main/sadl/init.py查看完整代码。
Python包已经发布到pypi.org。您可以通过pip install south-africa-driving-license来安装它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接