Рубрики
Без рубрики

Шифрование и дешифрование с помощью функций Python Azure

Зашифруйте и дешифруйте ваше имя, используя единовременные функции Pad и Azure. Tagged с помощью Python, Azure, Azurefunctions, шифрования.

Вдохновлен разделом 1.3 Дэвид Копек S ” Классические проблемы с информатикой в Python

Исходный код Для этой статьи о GitHub.

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

Как отмечалось выше, логика, используемая в этих примерах, происходит из книги Дэвида Копека. Я работал через это прошлой ночью и хотел взять этот раздел немного дальше. Я переопределял работу в разделе 1.3 «Нерушимое шифрование» в виде двух функций лазурных. Я проведу вас через процесс, чтобы вы тоже могли!

Соберите свои материалы

Прежде чем начать, вам понадобится следующее:

Создать виртуальную среду

Приложение Python Azure Functions требует, чтобы вы работали в виртуальной среде. Если вы не знакомы с использованием Вен , есть отличный учебник в Настоящий питон Анкет

Bash (macos или linux)

python3.6 -m venv .env  
source .env/bin/activate

PowerShell или командная строка (Windows)

py -3.6 -m venv .env
.\.env\Scripts\activate

Инициализировать приложение для функции Azure

Выполните следующую команду, чтобы создать новое приложение функции:

func init encryption_and_decryption

Теперь есть папка под названием incryption_and_decryption с кодом шаблона для приложения Python Azure Function. Если хотите, уделите некоторое время, чтобы открыть код в вашем любимом редакторе и осмотреть вокруг.

Если вы ищете редактора, я рекомендую Против кода Анкет

Создать функцию шифрования

Убедитесь, что вы в incryption_and_decryption каталог:

cd encryption_and_decryption

Создайте новую функцию, используя:

func new

В приглашении выберите HTTP Trigger . Затем назовите функцию шифровать Анкет

Шифрование ввода

Откройте файл Encrypt/__ init__.py . Вы должны увидеть код шаблона для функции триггера HTTP. Эта функция займет имя как параметр и вернуть “Привет Имя !”. Давайте добавим код внизу этого файла, который вместо этого будет шифровать имя Использование случайного набора токеновых байтов.

from secrets import token_bytes

def random_key(length: int) -> int:
    # returns length random bytes
    key: bytes = token_bytes(length)
    # convert key to bit string
    return int.from_bytes(key, "big")

Далее напишите функцию, чтобы использовать этот случайный ключ для шифрования имя :

from typing import Tuple

def encrypt(name: str) -> Tuple[int, int]:
    # returns (encrypted_name, dummy_key), encrypted by one-time pad
    # encode the name to bytes, then to a bit string
    name_as_bytes: bytes = name.encode()
    name_key: int = int.from_bytes(name_as_bytes, "big")

    # generate a dummy key for encryption
    dummy_key: int = random_key(len(name_as_bytes))

    # encrypt by XOR operation
    encrypted_name: int = name_key ^ dummy_key

    return encrypted_name, dummy_key

Здесь вы закодировали имя к номеру. Это просто еще один способ написания имя данные. Данные могут быть переведены обратно из этой формы. «Томас», поставить, хотя это преобразование 92807522771315 Анкет Вы можете увидеть это в Python Repl:

>>> name: str = "Thomas"
>>> name_as_bytes: bytes = name.encode()
>>> name_key = int.from_bytes(name_as_bytes, "big")
>>> print(f"name: {name}\nname_as_bytes: {name_as_bytes}\nname_key: {name_key}")
name: Thomas
name_as_bytes: b'Thomas'
name_key: 92807522771315

Я могу преобразовать его обратно:

>>> name_again = name_key.to_bytes((name_key.bit_length() + 7) // 8, "big").decode()
>>> print(name_again)
Thomas

Вы принимаете int Представление имени, называемое name_key и выполнить эксклюзивную или (xor) операцию с random_key int Анкет В Python xor делается с использованием ^ персонаж. Эта операция создает зашифрованную форму входного имени:

name_key ^ random_key = encrypted_name

Выполнение операции XOR снова с помощью random_key Отменит шифрование:

encrypted_name ^ random_key = name_key

В некотором смысле, random_key замки и разблокировки имя .

Используя шифрование

Теперь, когда у вас есть шифровать Функция написана, отредактируйте код шаблона, чтобы взять имя Введите, зашифруйте его и верните зашифрованное имя с помощью ключа. В целом, код в __init__.py должно понравиться так:

import logging
from secrets import token_bytes
from typing import Tuple


import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info("func: encrypt: request received")

    name = req.params.get("name")
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get("name")

    if name:
        # encrypt name
        encrypted_name, dummy_key = encrypt(name)

        response = str({"encrypted_name": encrypted_name, "dummy_key": dummy_key})
        return func.HttpResponse(response)
    else:
        # ask for input if none provided
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400,
        )


def random_key(length: int) -> int:
    # returns length random bytes
    key: bytes = token_bytes(length)
    # convert key to bit string
    return int.from_bytes(key, "big")


def encrypt(name: str) -> Tuple[int, int]:
    # return (encrypted_name, dummy_key); encrypted by one-time pad
    # encode the name to bytes, then to a bit string
    name_as_bytes: bytes = name.encode()
    name_key: int = int.from_bytes(name_as_bytes, "big")

    # generate a dummy key for encryption
    dummy_key: int = random_key(len(name_as_bytes))

    # encrypt by XOR operation
    encrypted_name: int = name_key ^ dummy_key

    return encrypted_name, dummy_key

Тестирование шифровано

Убедитесь, что вы в incryption_and_decryption каталог и запустите приложение функции с помощью команды:

func host start

Вывод этой команды включает в себя ссылку на конечную точку HTTP для этой функции: http://localhost: 7071/api/incrypt Анкет

Посещение этого URL -адреса в браузере вызовет функцию Azure, и вы получите ответ «Пожалуйста, передайте имя по строке запроса или в корпусе запроса». Передайте функцию A имя Параметр путем добавления ? Имя = София на URL, чтобы он читал:

http://localhost:7071/api/encrypt?name=Sophia

Вы получите ответ, который напоминает JSON с зашифрованным именем и фиктивным ключом:

{
    "encrypted_name": 191667540651033,
    "dummy_key": 278440108655992
}

Попробуйте это с разными именами!

Создать функцию расшифровки

Как и с шифровать функция, из командной строки, выполнить:

func new

В приглашении выберите HTTP Trigger . Затем назовите функцию дешифровать . Вы пройдете оба incrypted_name а также dummy_key к этой функции лазурь. Он выполнит операцию XOR, которая отменяет шифрование.

Дешифруя вход

Откройте файл Decrypt/__ init__.py Анкет Внизу этого файла добавьте функцию в расшифровку

def decrypt(encrypted_name: int, dummy_key: int) -> str:
    # returns XOR of encrypted_name and dummy_key converted to bytes and decoded
    name_key: int = encrypted_name ^ dummy_key
    return name_key.to_bytes((name_key.bit_length() + 7) // 8, "big").decode()

Как показано выше, выполнение операции XOR на incrypted_name и dummy_key выведет то же значение, что и name_key Анкет Затем функция отменяет кодирование из int к стр .

Примечание: В Python 3+, // Оператор делит числитель на знаменатель и возвращает коэффициент как int , сбрасывая цифры после десятичного десятичного.

например 5//2

Используя расшифровку

Отредактируйте код шаблона, чтобы принять два аргумента incrypted_name и dummy_key Анкет Это должно выглядеть так:

import logging

import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info("func: decrypt: request received")

    encrypted_name = req.params.get("encrypted_name")
    dummy_key = req.params.get("dummy_key")
    if not encrypted_name or not dummy_key:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            encrypted_name = req_body.get("encrypted_name")
            dummy_key = req_body.get("dummy_key")

    if encrypted_name and dummy_key:
        name = decrypt(int(encrypted_name), int(dummy_key))

        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400,
        )


def decrypt(encrypted_name: int, dummy_key: int) -> str:
    # returns XOR of encrypted_name and dummy_key converted to bytes and decoded
    name_key: int = encrypted_name ^ dummy_key
    return name_key.to_bytes((name_key.bit_length() + 7) // 8, "big").decode()

Тестирование расшифровки

Запустить приложение Function с Azure с

func host start

Используя выход из шифровать Функция Azure, проверить Decrypt Функция при посещении:

http://localhost:7071/api/decrypt?encrypted_name=133673440856088&dummy_key=47262719615353

Это должно вернуть “Привет, София!”.

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

Идти дальше

Функции Python Azure:

Код шифрования и дешифрования происходит от Дэвид Копек S Классические проблемы с информатикой в Python с разрешения автора.

Оригинал: “https://dev.to/teckert/encryption-and-decryption-with-python-azure-functions-4f05”