Python Реализация AES в режиме шифрования CBC - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь выполнить этот онлайн-запрос, в котором предлагается реализовать режим AES CBC без использования какой-либо библиотечной функции, которая сделает эту работу за меня (ofc xD). Я использую python3.7 и PyCrypto для модулей AES (кстати, я начинающий на Python)

Я чувствую, что нашел решение, но дело не в этом, я не вижу, что я делаю неправильно. Я ввожу этот текст: `

в сентябре 2017 года в сентябре 2017 года в сентябре 2017 года в сентябре 2017

` с этим ключом:

ЖЕЛТАЯ ПОДВОДНАЯ ЛОДКА

и с IV длиной в 16 байтов, полным 0 (\ x00)

, но мой вывод отличается от разных веб-сайтов, которые я могу найти в Интернете или при использовании режима AES CBC из PyCrypto модуля

вот небольшая программа, которую я сделал до сих пор для генерации моего шифрования aes cbc с комментариями:

#!/usr/bin/env python
from sys import argv
from Crypto.Cipher import AES
import codecs


def pad(plaintext):
    padding_len = 16 - (len(plaintext) % 16)
    print(padding_len)
    if padding_len == 16:
         return plaintext
padding = bytes([padding_len] * padding_len)
return plaintext + padding


def xor_for_char(input_bytes, key_input):
    index = 0
    output_bytes = b''
    for byte in input_bytes:
        if index >= len(key_input):
            index = 0
        output_bytes += bytes([byte ^ key_input[index]])
        index += 1
    return output_bytes


class AESCBCTool:
    def __init__(self):
        self.best_occurence = 0
        self.best_line = 0

def encrypt_CBC(self, enc, key):
    enc = pad(enc) # here I pad the text (PCKS#7 way)
    nb_blocks = (int)(len(enc) / 16) #calculate the number of blocks I've to iter through
    IV = bytearray(16)
    cipher = AES.new(key, AES.MODE_ECB)
    for i in range(nb_blocks):
            enc2 = xor_for_char(enc[i * 16:(i + 1) * 16], IV) #xor a block with IV
            IV = cipher.encrypt(enc2) # set the the IV based on the encryption of the xored text
            print(codecs.decode(codecs.encode(IV, 'base64')).replace("\n", ""), end='') #print the encrypted text in base 64


def main(filepath):
    f = open(filepath, "r")
    if f.mode == 'r':
        content = f.readlines()
        tool = AESCBCTool()
        for line_content in content:
            tool.encrypt_CBC(bytes(line_content, "utf-8"), bytes("YELLOW SUBMARINE", "utf-8"))
    f.close()


if __name__== "__main__":
    try:
        main(argv[1]) #this is the path to the file that contains the text
    except Exception as e:
        print(e)
        exit(84)
    exit(0)

вот мой вывод:

0TKm + DjGff6fB / l0Z + M5TQ == 8do1FSVvjbN2 + MhAULmjHA == w5vZtuiL2SrtSLi2CkMBzQ == nvKLm7C7QDmSxk2PqV3NHQ == 2 + DSu4BqXskn8 / znFCUCcQ ==

Между тем вывод должен быть:

IS4p7kpY9g0a68AUzpKzazbtbP0h3nYZvhptuxNajBS3KIUHGI3fu79e4fw + E34miyn5dMBle8Tqn2DvHsromy7AupMy0zbtlqPwU5uHoyY =

У вас есть какой-нибудь совет для меня, пожалуйста?

...