Часть 1: Как реализовать блокчейн с помощью Python простым способом.

Я хотел бы публиковать больше ценных статей на этом канале, ваша поддержка имеет решающее значение для этой экосистемы. Пожалуйста, следуйте за мной и хлопайте, если вам нравится то, что я пишу. Спасибо.

Блокчейн — это распределенная база данных, которая поддерживает постоянно растущий список упорядоченных записей, называемых блоками. Эти блоки связаны с помощью криптографии. Каждый блок содержит криптографический хэш предыдущего блока, метку времени и данные транзакции. Блокчейн — это децентрализованная, распределенная и общедоступная цифровая книга, которая используется для записи транзакций на многих компьютерах, поэтому запись не может быть изменена задним числом без изменения всех последующих блоков и консенсуса в сети.

Криптография связана с процессом преобразования обычного простого текста в неразборчивый текст и наоборот. Криптография не только защищает данные от кражи или изменения, но также может использоваться для аутентификации пользователей.

Урок 1. Цифровая подпись

Цифровые подписи используют асимметричную криптографию. Во многих случаях они обеспечивают уровень проверки и безопасности сообщений, отправляемых по незащищенному каналу: правильно реализованная цифровая подпись дает получателю основания полагать, что сообщение было отправлено заявленным отправителем.

Причина использования цифровых подписей проста в проверке и трудно воспроизведена.

Асимметричная криптография

Асимметричная криптография, также известная как криптография с открытым ключом, представляет собой процесс, в котором используется пара связанных ключей, один открытый ключ, а другой — закрытый ключ для шифрования и дешифрования сообщения соответственно. Он защищает его от несанкционированного доступа или использования.

RSA — одна из самых известных асимметричных криптографий. Открытый ключ является общедоступным, а закрытый ключ является секретным и никому не должен передаваться.

Прежде чем приступить к кодированию программы RSA, установите необходимый модуль, введя команду.

pip install cryptography --force

Генерация закрытого и открытого ключа

def generate_keys():
    private = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )    
    public = private.public_key()
    return private, public

Создает новый закрытый ключ RSA. key_size описывает, сколько битов должен быть ключ. Клавиши большего размера обеспечивают большую безопасность; в настоящее время 1024 и ниже считаются взломанными, в то время как 2048 или 4096 являются разумными размерами ключей по умолчанию для новых ключей. public_exponent указывает, каким будет одно математическое свойство генерации ключа. Если у вас нет особой причины поступать иначе, вы всегда должны использовать 65537.

Подписание сообщений закрытым ключом

Закрытый ключ можно использовать для подписи сообщения. Это позволяет любому, у кого есть открытый ключ, убедиться, что сообщение было создано кем-то, у кого есть соответствующий закрытый ключ. Подписи RSA требуют использования определенной хеш-функции и заполнения. Вот пример подписи message с использованием RSA, с безопасной хеш-функцией и дополнением:

def sign(message, private):
    message = bytes(str(message), 'utf-8')
    sig = private.sign(
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    return sig

Допустимые отступы для подписи: PSS и PKCS1v15. PSS рекомендуется для любых новых протоколов или приложений, PKCS1v15 следует использовать только для поддержки устаревших протоколов.

Если ваши данные слишком велики для передачи в одном вызове, вы можете хешировать их отдельно и передать это значение с помощью Prehashed.

Проверка сообщений с помощью открытого ключа

В предыдущем разделе описано, что делать, если у вас есть закрытый ключ и вы хотите что-то подписать. Если у вас есть открытый ключ, сообщение, подпись и используемый алгоритм подписи, вы можете проверить, использовался ли закрытый ключ, связанный с данным открытым ключом, для подписи этого конкретного сообщения. Вы можете получить открытый ключ для проверки с помощью load_pem_public_key(), load_der_public_key(), public_key() или public_key().

def verify(message, sig, public):
    message = bytes(str(message), 'utf-8')
    try:
        public.verify(
            sig,
            message,
            padding.PSS(
              mgf=padding.MGF1(hashes.SHA256()),
              salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return True
    except InvalidSignature:
        return False
    except:
        return False

Если подпись не совпадает, verify() вызовет исключение InvalidSignature.

Если ваши данные слишком велики для передачи в одном вызове, вы можете хешировать их отдельно и передать это значение с помощью Prehashed.

Инициализация программы:

if __name__ == '__main__':
    print('Generating Key 1')
    pr,pu = generate_keys()

    message = "This is a secret message"
    sig = sign(message, pr)
    print('Key 1 Private Key signed message, verify with Key 1 Public Key')
    correct = verify(message, sig, pu)

    if correct:
        print("Success verifying")
    else:
        print ("ERROR! Signature is bad")

    print('Generating Key 2')
    pr2, pu2 = generate_keys()
    sig2 = sign(message, pr2)

    print('Key 2 Private Key signed message, verify with Key 1 Public Key')
    correct= verify(message, sig2, pu)
    if correct:
        print("Success verifying")
    else:
        print ("ERROR! Signature is bad")

    badmess = message + "Q"
    correct= verify(badmess, sig, pu)

    if correct:
        print("Same Message")
    else:
        print("Tampering detected")

Вывод:

Создание 3 наборов тестов:

Во-первых, при создании ключа 1 и использовании закрытого ключа 1 для подписи сообщения и использовании открытого ключа 1 для проверки сообщения результат показывает тот же открытый ключ и закрытый ключ, результат должен быть истинным.

Во-вторых, при создании ключа 2 и использовании закрытого ключа 2 для подписи сообщения и использовании открытого ключа 1 для проверки сообщения результат показывает ошибку! Подпись плохая. Это означало, что разные ключи не могут успешно проверить сообщение.

В-третьих, добавление одного символа после исходного сообщения показывает, что мы не можем успешно пройти проверку. Это означало, что данные были кем-то подделаны.

Следующий урок о функции хеширования.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.