{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n", "from cryptography.hazmat import backends" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Представление числа в виде битовой строки\n", "get_bin = lambda x, n: format(x, 'b').zfill(n)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Представление массива чисел в виде битовой строки\n", "def byte_array_to_binary_string(array):\n", " str_output = \"\"\n", " for i in range(len(array)):\n", " str_output += get_bin(array[i],8)\n", " return str_output" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Вычисление расстояние Хэмминга для строк из нулей и единиц\n", "def hamming_distance(str1, str2):\n", " counter = 0\n", " for i in range(min(len(str1),len(str2))):\n", " if str1[i] != str2[i]:\n", " counter += 1\n", " return counter" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def xor_of_bytes_arrays(arr1, arr2):\n", " xor_bytes = bytearray()\n", " for i in range(min(len(arr1), len(arr2))):\n", " xor_bytes.append(arr1[i] ^ arr2[i])\n", " return xor_bytes" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Два открытых текста, отличающихся в одном бите\n", "# TODO: попробуйте использовать открытый текст длиной, не кратной размеру шифруемого блока. Объясните результат.\n", "plain_text1 = b\"a secret message\"\n", "plain_text2 = b\"c secret message\"" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01100001001000000111001101100101011000110111001001100101011101000010000001101101011001010111001101110011011000010110011101100101\n", "01100011001000000111001101100101011000110111001001100101011101000010000001101101011001010111001101110011011000010110011101100101\n", "Hamming distance = 1\n", "XORed plain texts = 00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n" ] } ], "source": [ "print(byte_array_to_binary_string(plain_text1))\n", "print(byte_array_to_binary_string(plain_text2))\n", "print(\"Hamming distance = \", hamming_distance(byte_array_to_binary_string(plain_text1), byte_array_to_binary_string(plain_text2)))\n", "print(\"XORed plain texts = \", byte_array_to_binary_string(bytes(xor_of_bytes_arrays(plain_text1, plain_text2))))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Key = 01001000010100010111111001110010111001101010100110000101101101001101101110011111101111011010101100011110111010101101101000111010\n" ] } ], "source": [ "# Генерация ключа длиной 128 бит. \n", "# TODO: попробуйте задать другую длину ключа. Объясните результат\n", "key = os.urandom(16)\n", "print(\"Key = \", byte_array_to_binary_string(key))\n", "cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backends.default_backend())\n", "encryptor1 = cipher.encryptor()\n", "encryptor2 = cipher.encryptor()\n", "decryptor1 = cipher.decryptor()\n", "decryptor2 = cipher.decryptor()\n", "decryptor3 = cipher.decryptor()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cipher text's length = 16 , 16\n", "b'a secret message'\n" ] } ], "source": [ "# Шифрование сообщений.\n", "# TODO: Почему для каждого сообщения используется свой экземпляр шифратора\n", "cipher_text1 = encryptor1.update(plain_text1) + encryptor1.finalize()\n", "cipher_text2 = encryptor2.update(plain_text2) + encryptor2.finalize()\n", "print(\"Cipher text's length = \", len(cipher_text1), \",\", len(cipher_text2))\n", "print(decryptor1.update(cipher_text1))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01111001011111110111001011000100111101101000011000011100010011111101111110100011100000110110000000011100011101010110110110101011\n", "10000010111001110010001101010111010010111111000110110011110010101100010001110101110110011001001110011010101010000000011100111111\n", "Hamming distance = 73\n" ] } ], "source": [ "print(byte_array_to_binary_string(cipher_text1))\n", "print(byte_array_to_binary_string(cipher_text2))\n", "print(\"Hamming distance = \", hamming_distance(byte_array_to_binary_string(cipher_text1), byte_array_to_binary_string(cipher_text2)))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "XORed cipher texts = 11111011100110000101000110010011101111010111011110101111100001010001101111010110010110101111001110000110110111010110101010010100\n" ] } ], "source": [ "xored_cipher_text = bytes(xor_of_bytes_arrays(cipher_text1, cipher_text2))\n", "print(\"XORed cipher texts = \", byte_array_to_binary_string(xored_cipher_text))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b',\\xe1\\xbb\\xc1(Y\\xb6\\xa4\\x13\\xeb?\\xebC\\x18p8'\n" ] } ], "source": [ "print(decryptor2.update(xored_cipher_text))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'V\\x9e\\xa2i\\xaf^\\xf23\\x9c:\\xf3Q\\xed\\x03\\xa4\\x0b'\n" ] } ], "source": [ "# Стравните (plain_text1) XOR (plain_text2) с результатом расшифрования decryptor2.update(xored_cipher_text). Объясните результат сравнения\n", "xored_plain_text = bytes(xor_of_bytes_arrays(plain_text1, plain_text2))\n", "print(decryptor1.update(xored_plain_text))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }