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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| import csv from Crypto.PublicKey import DSA from Crypto.Signature import DSS from Crypto.Hash import SHA256 import base64
def load_public_key(filename): with open(filename, 'rb') as f: key = DSA.import_key(f.read()) return key
def verify_signature(data, signature, public_key): h = SHA256.new(data.encode()) verifier = DSS.new(public_key, 'fips-186-3') try: verifier.verify(h, base64.b64decode(signature)) return True except ValueError: return False
def validate_signatures(data_file, signature_file, flag_file): with open(flag_file, 'w', newline='', encoding='utf-8') as f_flag: flag_writer = csv.writer(f_flag) flag_writer.writerow(['userid', 'name', 'idcard', 'phone'])
with open(data_file, 'r', encoding='utf-8') as f_data, open(signature_file, 'r', encoding='utf-8') as f_sig: reader_data = csv.reader(f_data) reader_sig = csv.reader(f_sig)
next(reader_data) next(reader_sig)
for data_row, sig_row in zip(reader_data, reader_sig): userid, name, idcard, phone = data_row username, name_signature, idcard_signature, phone_signature = sig_row
public_key_filename = f"public/public-{userid.zfill(4)}.pem" public_key = load_public_key(public_key_filename)
is_name_valid = verify_signature(name, name_signature, public_key) is_idcard_valid = verify_signature(idcard, idcard_signature, public_key) is_phone_valid = verify_signature(phone, phone_signature, public_key)
if not is_name_valid or not is_idcard_valid or not is_phone_valid: flag_writer.writerow([userid, name, idcard, phone])
print(f"用户{userid}验证结果:") print(f" 姓名签名验证{'通过' if is_name_valid else '失败'}") print(f" 身份证签名验证{'通过' if is_idcard_valid else '失败'}") print(f" 电话签名验证{'通过' if is_phone_valid else '失败'}") print("-" * 30)
data_file = 'output_sorted_unique.csv' signature_file = 'data-sign.csv' flag_file = 'flag.csv'
validate_signatures(data_file, signature_file, flag_file)
|