Программа подписи файлов. Подпись файлов RSA с помощью Python. Реализация подписи файлов на Python

February 2, 2019 00:24

Задание к лабораторной работе: разработать программу для подписи файлов с помощью алгоритма RSA на любом языке программирования (предпочтительно C#, но можно выбрать любой другой, мы будем использовать Python). 

Что такое RSA?

RSA - алгоритм криптографии с открытым ключом, является системой подходящей для шифрования и подписи данных (файлов, текстов, и любых других данных). Для начала работы генерируется пара ключей: открытый и закрытый. С помощью закрытого подписываются данные на начальном этапе. С помощью открытого данные расшифровываются в конце своего пути (например, при передаче данных кому-то).

Пример работы программы (для увеличения, нажмите на картинку):

Пример работы программы
Пример работы программы

Параметры запуска:

  • $ python main.py --generate - генерация публичного и приватного ключей;
  • $ python main.py --sign - подпись файла приватным ключом;
  • $ python main.py --verify - проверка подписи;
  • passphrase - пароль для ваших ключей;
  • secret - тот же самый пароль, запрашиваемый при подписи, для проверки личности. 

Реализация программы подписи данных и файлов с помощью RSA на Python:

#!/bin/env python 

from argparse import ArgumentParser
from sys import argv
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
import base64


def sign(args):

    with open(args.sign[0], "rb") as file:
        digest = SHA256.new()
        digest.update(file.read())

    with open(args.sign[1] , "r") as file:
        secret = RSA.importKey(file.read(), passphrase=str(input("Secret: ")))
        signer = PKCS1_v1_5.new(secret)

        sign = signer.sign(digest)

    with open(f'{args.sign[0]}.sign', 'wb') as file:
        file.write(base64.b64encode(sign))


def verify(args):

    with open(args.verify[0], 'rb') as file:
        digest = SHA256.new()
        digest.update(file.read())

    with open(args.verify[1]) as file:
        pub_key = RSA.importKey(file.read()).publickey()

    with open(args.verify[2]) as file:
        signature = base64.b64decode(file.read())

    verifier = PKCS1_v1_5.new(pub_key)

    if verifier.verify(digest, signature):
        print('Verified')
    else:
        print('Invalid sign')
    # assert verifier.verify(digest, signature), 'Invalid sign'
    # 
    # print('Verified')
    

def generate(args):
    key = RSA.generate(1024)

    with open('priv_key.pem', 'wb') as file:
        file.write(key.exportKey(passphrase=str(input('Passphrase: '))))

    with open('pub_key.pem', 'wb') as file:
        file.write(key.publickey().exportKey())


if __name__ == '__main__':
    parser = ArgumentParser(argv[0])

    parser.add_argument("--sign",
                        metavar=('<path-to-file>','<path-to-secret>'),
                        nargs=2,
                        type=str)
                        
    parser.add_argument("--verify",
                        metavar=('<path-to-file>', '<path-to-pubkey>', '<path-to-sign>'),
                        nargs=3,
                        type=str)

    parser.add_argument("--generate",
                        action='store_true')

    args = parser.parse_args()

    if (args.sign):
        sign(args)

    if (args.verify):
        verify(args)

    if (args.generate):
        generate(args)