为了账号安全,请及时绑定邮箱和手机立即绑定

给定明文、密文和 IV。我可以找到重复使用的钥匙吗?

给定明文、密文和 IV。我可以找到重复使用的钥匙吗?

烙印99 2023-08-22 14:53:05
大家好我被一门编程课的作业的一部分所困扰。我相信解决方案非常简单,但出于某种原因我无法理解它。作业的目标是修改密文,使美元金额严格增加。加密和解密的类是给定的,不能编辑,添加代码进行攻击。攻击充当中间人,并在调用解密之前检索加密的输出。请注意,密钥是从重复使用的文件中检索的,因此每次加密和解密都使用相同的密钥。我们还可以假设我们知道消息的布局。我最初的反应是,因为我们知道密钥是相同的,并且因为我们有明文、密文和攻击中的 IV,所以必须有一个简单的解决方案来修改密文。我尝试在修改密文后计算一个新标签,但密文依赖于先前的输入(IV),因此这不起作用。我假设有一个相对简单的解决方案是否正确?注意:不一定要寻找完整编码的答案,只是需要一些解决此问题的方法的指导。助教的办公时间很混乱,网上的一切都乱七八糟:(谢谢!#### EXAMPLE KEY #####2D7F8E92A8E7109258C879F878E12387######################class encryptimport sysimport osimport Crypto.Cipher.AESimport hashlibf = open(sys.argv[1], 'r')key = f.readline()key = bytes.fromhex(key[:32])f.close()message = \"""AMOUNT: $  10.00Originating Acc Holder: DoeOrgininating Acc #82123-098370I authorized the above amount to be transferred to the account #38108-443280held 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 decryptimport sysimport Crypto.Cipher.AESimport hashlibf = 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 ivtag = 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 ivif tag.hex() != hashlib.sha256(plaintext).hexdigest():   print("Invalid tag!")else:   print("Verified message")   print(plaintext.decode())class attack
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

查看使用 CBC 模式解密的第一个块

   PlainText = Decrypt(CipherText, Key) ^ IV.

您知道 PlainText,也知道 IV,并且您有一个想要创建的新文本 FakeText。应该非常清楚如何将 IV 更改为新的 IV',以便最终得到 FakeText 而不是 PlainText。你并不关心解密的结果是什么,只关心它是某个常数。

除此之外,这是你的作业。


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 1559 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信