【问题标题】:Trouble decrypting bytes with ECB mode encryption使用 ECB 模式加密解密字节时遇到问题
【发布时间】:2019-01-04 21:50:15
【问题描述】:

我在使用 openssl crate 解密字节字符串时遇到问题。作为提示,这是针对 Cryptopals 挑战的,特别是设置 2 问题 2。文本文件已使用 CBC 模式的 AES 加密,但我猜单个块可以使用 ECB 解密。

我已经尝试过使用 CBC 模式解密整个 10.txt 文件,我知道这是可行的。我还使用以下 Python 代码来验证 ECB 对相同字节的解密是否也有效。

对于 Python 3:

from base64 import b64decode
from Crypto.Cipher import AES
def main():
    key = b'YELLOW SUBMARINE'
    with open("10.txt") as input_file:
        data = b64decode(input_file.read())

    data = data[0:AES.block_size]
    print(data)
    cipher = AES.new(key, AES.MODE_ECB)
    x = cipher.decrypt(data)
    print(x)
    return

对于锈:

extern crate openssl;

use openssl::symm::decrypt;
use openssl::symm::{encrypt, Cipher};

static KEY: &'static [u8] = b"YELLOW SUBMARINE";

fn main() -> std::io::Result<()> {
    // No idea why this OpenSSL call doesn't work.
    let data = b"\x09\x12\x30\xaa\xde\x3e\xb3\x30\xdb\xaa\x43\x58\xf8\x8d\x2a\x6c";
    let cipher = Cipher::aes_128_ecb();
    let new_data = decrypt(cipher, KEY, None, data);
    println!("error {:?}", new_data);

    Ok(())
}

我希望看到这个函数在 Rust 中解密字节字符串,就像它在 python 中所做的那样。

【问题讨论】:

  • ECB 模式当然不使用 IV(它在您的 Python 代码中完全独立,可怜的 IV)。默认情况下,OpenSSL 始终期望 PKCS#7 兼容填充。
  • 我修复了代码问题和我对初始化向量的误导性评论。感谢您指出这些。

标签: python rust cryptography aes


【解决方案1】:

OpenSSL 告诉您您的输入未正确填充。将输入更改为

let data = b"\x09\x12\x30\xaa\xde\x3e\xb3\x30\xdb\xaa\x43\x58\xf8\x8d\x2a\x6c\x60\xfa\x36\x70\x7e\x45\xf4\x99\xdb\xa0\xf2\x5b\x92\x23\x01\xa5";

您会看到您的代码正确解密了它。

如果您需要禁用填充,可以通过使用 Crypter 对象并在其上调用 .pad(false) (example) 来实现。

【讨论】:

  • 请原谅这个愚蠢的问题,但你是如何得到最后 16 个字节的?给定一个长度不是 mod 16 == 0 的文本文件,我本来希望在字节流的末尾需要一个填充。所以我很困惑为什么后半部分不是10.txt中的内容非常感谢。
  • @jdim printf "I'm back and I'm" | openssl enc -aes-128-ecb -K 59454c4c4f57205355424d4152494e45。始终添加至少 1 个字节的填充(启用时),即使长度可被块大小整除,否则在解密时是否应删除填充将是不明确的。
  • 知道了,根据this RFC。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多