Python. Криптография

Mr.R060t

Новичок
Пользователь
Ноя 18, 2022
3
0
1
Подскажите пожалуйста где ошибся или неправильно написал код. Код работает, но 5-е чувство подсказывает что он неправильный.
Буду очень признателен за любую помощь.
Если возможно, был бы рад коду с комментариями. P.S.
Условие задачи:
Реализуйте атакующую грубую нагрузку на текст, зашифрованный AES.
В качестве возможности получения трехзначного числа.

Код:

from Crypto.Cipher import AES
from Crypto import Random
import hashlib
import random

BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

plain_text = """We are Anonymous.
We are Legion.
We do not forgive.
We do not forget.
Expect us.
"""
key = hashlib.sha256(b"357").digest()
print("Key:", key)
plain_text = pad(plain_text)
iv = Random.new().read(BS)
cipher = AES.new(key, AES.MODE_CBC, iv)
cipher_text = (iv + cipher.encrypt(plain_text.encode()))
print("\nCiphered text:", cipher_text)
correctPassword = "357"
wrongPasswords = []
password = ""
length = 3
chars = "1234567890"
run = True
while run:
password = ""
for i in range(length):
password += random.choice(chars)
if password not in wrongPasswords:
if password != correctPassword:
print(password)
wrongPasswords.append(password)
else:
run = False
break
print(password + "is correct")
unpad = lambda s : s[:-ord(s[len(s)-1:])]
cipher_text = cipher_text
iv = cipher_text[:BS]
cipher = AES.new(key, AES.MODE_CBC, iv)
plain_text = unpad(cipher.decrypt(cipher_text[BS:]))
print("\nPlain text:", plain_text)
 
Последнее редактирование:

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
Зачем выкладывать код вложением? Так меньше шансов, что вам кто-то захочет помочь.

Это кому лень качать и мусорить у себя:
Python:
from Crypto.Cipher import AES
from Crypto import Random
import hashlib
import random


BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)


plain_text = """We are Anonymous.
We are Legion.
We do not forgive.
We do not forget.
Expect us.
"""

key = hashlib.sha256(b"357").digest()
print("Key:", key)

plain_text = pad(plain_text)
iv = Random.new().read(BS)
cipher = AES.new(key, AES.MODE_CBC, iv)
cipher_text = (iv + cipher.encrypt(plain_text.encode()))
print("\nCiphered text:", cipher_text)

correctPassword = "357"
wrongPasswords = []
password = ""
length = 3
chars = "1234567890"
run = True

while run:
    password = ""

    for i in range(length):
        password += random.choice(chars)

    if password not in wrongPasswords:
        if password != correctPassword:
            print(password)
            wrongPasswords.append(password)
        else:
            run = False
            break
print(password + "is correct")

unpad = lambda s : s[:-ord(s[len(s)-1:])]
cipher_text = cipher_text
iv = cipher_text[:BS]
cipher = AES.new(key, AES.MODE_CBC, iv)
plain_text = unpad(cipher.decrypt(cipher_text[BS:]))
print("\nPlain text:", plain_text)


И ещё такой вопрос по коду - скорее придирка, но всё же. Вот вы пишите цикл:
run = True

while run:

password = ""

for i in range(length):
password += random.choice(chars)

if password not in wrongPasswords:
if password != correctPassword:
print(password)
wrongPasswords.append(password)
else:
run = False
break


Обратите внимание как вы выходите из него))) Зачем под это дело объявлять лишнюю переменную, так ещё и оператор break юзать? Что-то одно было бы достаточно.
 

Mr.R060t

Новичок
Пользователь
Ноя 18, 2022
3
0
1
Зачем выкладывать код вложением? Так меньше шансов, что вам кто-то захочет помочь.

Это кому лень качать и мусорить у себя:
Python:
from Crypto.Cipher import AES
from Crypto import Random
import hashlib
import random


BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)


plain_text = """We are Anonymous.
We are Legion.
We do not forgive.
We do not forget.
Expect us.
"""

key = hashlib.sha256(b"357").digest()
print("Key:", key)

plain_text = pad(plain_text)
iv = Random.new().read(BS)
cipher = AES.new(key, AES.MODE_CBC, iv)
cipher_text = (iv + cipher.encrypt(plain_text.encode()))
print("\nCiphered text:", cipher_text)

correctPassword = "357"
wrongPasswords = []
password = ""
length = 3
chars = "1234567890"
run = True

while run:
    password = ""

    for i in range(length):
        password += random.choice(chars)

    if password not in wrongPasswords:
        if password != correctPassword:
            print(password)
            wrongPasswords.append(password)
        else:
            run = False
            break
print(password + "is correct")

unpad = lambda s : s[:-ord(s[len(s)-1:])]
cipher_text = cipher_text
iv = cipher_text[:BS]
cipher = AES.new(key, AES.MODE_CBC, iv)
plain_text = unpad(cipher.decrypt(cipher_text[BS:]))
print("\nPlain text:", plain_text)


И ещё такой вопрос по коду - скорее придирка, но всё же. Вот вы пишите цикл:
run = True

while run:

password = ""

for i in range(length):
password += random.choice(chars)

if password not in wrongPasswords:
if password != correctPassword:
print(password)
wrongPasswords.append(password)
else:
run = False
break


Обратите внимание как вы выходите из него))) Зачем под это дело объявлять лишнюю переменную, так ещё и оператор break юзать? Что-то одно было бы достаточно.
 

Mr.R060t

Новичок
Пользователь
Ноя 18, 2022
3
0
1
За вложение понял ошибку и исправил. По поводу кода, если честно я не совсем все понимаю, кусок кода про пароль искал по разным сайтам, и лепил что понял. Но я так понимаю что надо чтобы пароль создавался сам после шифрования текста, и потом его надо узнать посредством взлома, а у меня по коду стоит заведомо известный пароль.
 

Форум IT Специалистов