Учитывая открытый текст, зашифрованный текст и IV. Могу ли я найти повторно используемый ключ?

всем привет

Я застрял на части задания для одного из моих классов программирования. Я считаю, что решение довольно простое, но по какой-то причине я не могу его понять.

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

Моя первоначальная реакция заключалась в том, что, поскольку мы знаем, что ключ один и тот же, и поскольку у нас есть открытый текст, зашифрованный текст и IV в атаке, должно быть простое решение для модификации зашифрованного текста. Я пытался вычислить новый тег после изменения зашифрованного текста, но зашифрованный текст зависит от предыдущего ввода (IV), так что это не работает. Правильно ли я предполагаю, что существует относительно простое решение?

Примечание. Не обязательно искать полностью закодированный ответ, просто вам нужны некоторые рекомендации по подходу к этой проблеме. Часы работы офиса TA были в беспорядке со всем онлайн :(

Спасибо!


#### EXAMPLE KEY #####
2D7F8E92A8E7109258C879F878E12387
######################

class encrypt

import sys
import os
import Crypto.Cipher.AES
import hashlib

f = open(sys.argv[1], 'r')
key = f.readline()
key = bytes.fromhex(key[:32])
f.close()

message = \
"""AMOUNT: $  10.00
Originating Acc Holder: Doe
Orgininating Acc #82123-098370

I authorized the above amount to be transferred to the account #38108-443280
held by a student at the National Bank of the Cayman Islands.
"""

iv = os.urandom(16)
cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CBC, IV=iv)
ciphertext = cipher.encrypt(message.encode()).hex()
tag = hashlib.sha256(message.encode()).hexdigest()
print(iv.hex() + ciphertext + tag)

class decrypt

import sys
import Crypto.Cipher.AES
import hashlib

f = open(sys.argv[1], 'r')
key = f.readline()
key = bytes.fromhex(key[:32])
f.close()

ciphertextWithTag = bytes.fromhex(sys.argv[2]) # bytes.fromhex($CT)

if len(ciphertextWithTag) < 16+16+32:
  print("Ciphertext is too short!")
  sys.exit(0)

iv = ciphertextWithTag[:16]
ciphertext = ciphertextWithTag[:len(ciphertextWithTag)-32]  # with iv
tag = ciphertextWithTag[len(ciphertextWithTag)-32:]
cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CBC, IV=iv)
plaintext = cipher.decrypt(ciphertext[16:]) # here [16:] has spare apart iv

if tag.hex() != hashlib.sha256(plaintext).hexdigest():
   print("Invalid tag!")
else:
   print("Verified message")
   print(plaintext.decode())
class attack


import sys

ciphertextWithTag = bytes.fromhex(sys.argv[1])

if len(ciphertextWithTag) < 16+16+32:
  print("Ciphertext is too short!")
  sys.exit(0)

iv = ciphertextWithTag[:16]
ciphertext = ciphertextWithTag[:len(ciphertextWithTag)-32]
tag = ciphertextWithTag[len(ciphertextWithTag)-32:]

# TODO: Modify the input so the transfer amount is more lucrative to the recipient

# TODO: Print the new encrypted message
# you can change the print content if necessary
print(ciphertext.hex() + tag.hex())

person HummaMumma    schedule 18.09.2020    source источник


Ответы (1)


Посмотрите на самый первый блок, расшифрованный в режиме CBC.

   PlainText = Decrypt(CipherText, Key) ^ IV.  

Вы знаете PlainText, знаете IV, и у вас есть новый текст FakeText, который вы хотите создать. Должно быть довольно ясно, как изменить IV на новый IV', чтобы в итоге вы получили FakeText вместо PlainText. Вам все равно, каковы результаты расшифровки, просто это какая-то константа.

Кроме того, это ваша домашняя работа.

person Frank Yellin    schedule 18.09.2020