Ошибка при проверке RSA-подписи
При проверке подписи мне выводит ошибку:No PEM start marker "b'-----BEGIN RSA PUBLIC KEY-----'" found, с чем она связана и как её исправить?
Я разрабатываю приложение на PyQT5, в данном окне приложения можно подписать документ и проверить подпись:
class MainWindow(QDialog):
def __init__(self):
super().__init__()
self.public_key_path = "public_key.pem"
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
self.setGeometry(100, 100, 600, 400)
sign_button = QPushButton('Подписать документ', self)
verify_button = QPushButton('Проверить подпись', self)
sign_button.clicked.connect(self.sign_document)
verify_button.clicked.connect(self.check_signature)
layout.addWidget(sign_button)
layout.addWidget(verify_button)
self.setLayout(layout)
def generate_key_pair(self):
public_key, private_key = rsa.newkeys(2048)
with open('private_key.pem', 'wb') as f:
f.write(private_key.save_pkcs1())
with open('public_key.pem', 'wb') as f:
f.write(public_key.save_pkcs1())
return public_key
def sign_document(self):
file_dialog = QFileDialog(self)
file_path, _ = file_dialog.getOpenFileName()
if file_path:
try:
self.generate_key_pair()
with open(file_path, 'rb') as doc_file:
document_data = doc_file.read()
private_key_path = "private_key.pem"
signature_output_file = "signed_data.txt"
self.sign_and_save_data(document_data, private_key_path, signature_output_file)
QMessageBox.information(self, 'Успех', 'Документ подписан успешно')
except Exception as e:
QMessageBox.warning(self, 'Ошибка', f'Ошибка в подписи документов: {e}')
def sign_and_save_data(self, data, private_key_path, save_file):
with open(private_key_path, "rb") as key_file:
private_key = rsa.PrivateKey.load_pkcs1(key_file.read())
hashed_data = rsa.compute_hash(data, 'SHA-256')
signature = rsa.sign(hashed_data, private_key, 'SHA-256')
with open(save_file, 'wb') as f:
f.write(signature)
f.write(b'\n')
f.write(private_key.save_pkcs1())
def check_signature(self):
document_path, _ = QFileDialog.getOpenFileName(None, 'Выберите документ', '', 'All Files (*)')
if not document_path:
return
try:
with open(document_path, 'rb') as file:
document_content = file.read()
signature_path, _ = QFileDialog.getOpenFileName(None, 'Выберите подпись', '', 'All Files (*)')
if not signature_path:
return
with open(signature_path, 'rb') as file:
signature = file.read()
public_key = rsa.PublicKey.load_pkcs1(signature.replace(b'\n', b'')) # Извлекаем открытый ключ из файла с подписью
hashed_data = rsa.compute_hash(document_content, 'SHA-256')
rsa.verify(hashed_data, signature, public_key)
QMessageBox.information(None, 'Результат проверки', 'Подпись и данные действительны')
except rsa.pkcs1.VerificationError:
QMessageBox.critical(None, 'Результат проверки', 'Подпись или данные недействительны')
except Exception as e:
QMessageBox.critical(None, 'Ошибка', f'Произошла ошибка при проверке подписи: {e}')
Документ подписывает без ошибок, а вот при при проверке выводит ошибку: No PEM start marker "b'-----BEGIN RSA PUBLIC KEY-----'", никак не могу понять: как её исправить и из-за чего вообще она происходит.