Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

Python электронная подпись

Всем привет. Помогите разобраться с вопросом. Рассмотрим такой случай, у моей программы есть пользователи и я отправлю файлы, программа у пользователя считывает эти данные. Хочу проверить данные от подмены. Для этого с данными отправляю хэш(в файле) передаваемого файла что бы сравнить. Теперь как защитить этот файл с хэшом? 1. Асимметричное шифрование - для этого мне в программе нужно держать приватный ключ чтобы расшифровать. Тогда могут дикомпелировать программу и узнать приватный ключ, далее публичный и подменять данные. 2. Электронная подпись которая шифрует приватным и расшифровывает публичным, вариант вроде подходящий, но как применить это не ясно, что бы в python проверять хэш. Получилось подписать файл, но для этого я использовал в Window (makecert.exe и signtool.ex) а как это сделать средствами python или может быть есть другой вариант для шифрования закрытым ключом. Спасибо.


Ответ

Я использовал библиотеку pycryptodome (поскольку pycrypto, похоже, больше не поддерживается).
from Crypto.Hash import SHA256 from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 import os
fname ="Путь к файлу"
# Генерируете новый ключ (или берете ранее сгенерированный) key = RSA.generate(1024, os.urandom) # Получаете хэш файла h = SHA256.new() with open(fname, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): h.update(chunk)
# Подписываете хэш signature = pkcs1_15.new(key).sign(h)
# Получаете открытый ключ из закрытого pubkey = key.publickey()
# Пересылаете пользователю файл, публичный ключ и подпись # На стороне пользователя заново вычисляете хэш файла (опущено) и сверяете подпись pkcs1_15.new(pubkey).verify(h, signature)
# Отличающийся хэш не должен проходить проверку pkcs1_15.new(pubkey).verify(SHA256.new(b'test'), signature) # raise ValueError("Invalid signature")

Комментариев нет:

Отправить комментарий