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")
|