1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
   | from Crypto.PublicKey import DSA from Crypto.Hash import SHA256 from Crypto.Signature import DSS from Crypto.PublicKey.DSA import DsaKey from tqdm import tqdm import base64 import json import os
  post_data: dict[int, dict[str, str]] = {} with open('data.pcapng.txt', 'rt') as pcapng_data:     for line in pcapng_data:         if not line: continue         param, data = line.split('\t')         username = int(param.split('=')[1])         user_data = json.loads(data)         post_data[username] = user_data
  public_keys: dict[int, DsaKey] = {} for root, dirs, files in os.walk('public'):     for file in tqdm(files):         with open(os.path.join(root, file), 'rt') as src:             username = int(file[-8:-4])             public_key = DSA.import_key(src.read())             public_keys[username] = public_key
  signatures: dict[int, dict[str, str]] = {} with open('data-sign.csv', 'rt') as src:     header = src.readline().strip().split(',')     for line in src:         username, name_signature, idcard_signature, phone_signature = \             line.strip().split(',')         signatures[int(username)] = {             'name': name_signature,             'idcard': idcard_signature,             'phone': phone_signature}
  def verify_signature(public_key: DsaKey, message: str, signature: str) -> bool:     h = SHA256.new(message.encode('utf-8'))     verifier = DSS.new(public_key, 'fips-186-3')     try:         verifier.verify(h, base64.b64decode(signature))         return True     except (ValueError, TypeError):         return False
  with open('result.csv', 'wt', encoding='utf-8') as output:     output.write('userid,name,idcard,phone\n')     for username, data in tqdm(sorted(post_data.items())):         if all(verify_signature(                 public_keys[username], data[key], signatures[username][key])                 for key in ['name', 'idcard', 'phone']): continue         output.write(             f"{username},{data['name']},{data['idcard']},{data['phone']}\n")
   |