首页 > 解决方案 > 使用 ECB 模式加密解密字节时遇到问题

问题描述

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

我已经尝试过10.txt使用 CBC 模式解密整个文件,并且我知道这是可行的。我还使用以下 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 中一样。

标签: pythonrustcryptographyaes

解决方案


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)它来实现(示例)。


推荐阅读