всем привет
Я застрял на части задания для одного из моих классов программирования. Я считаю, что решение довольно простое, но по какой-то причине я не могу его понять.
Цель задания — изменить зашифрованный текст таким образом, чтобы сумма в долларах строго увеличилась. Классы 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())