Python 使用ECB模式加密解密字节时出现问题

Python 使用ECB模式加密解密字节时出现问题,python,rust,cryptography,aes,Python,Rust,Cryptography,Aes,使用openssl板条箱解密字节字符串时遇到问题。作为提示,这是针对Cryptopals的挑战,特别是设置2问题2。文本文件已使用AES和CBC模式进行加密,但我猜单个块可以使用ECB进行解密 我已经尝试过用CBC模式解密整个10.txt文件,我知道这是可行的。我还使用了下面的Python代码来验证sames字节的ECB解密是否也有效 对于Python 3: 从base64导入B64解码 从Crypto.Cipher导入AES def main(): 钥匙=b‘黄色潜水艇’ 打开(“10.txt

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

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

对于Python 3:

从base64导入B64解码
从Crypto.Cipher导入AES
def main():
钥匙=b‘黄色潜水艇’
打开(“10.txt”)作为输入文件:
数据=B64解码(输入文件.read())
数据=数据[0:AES.块大小]
打印(数据)
密码=AES.new(密钥,AES.MODE\u ECB)
x=密码。解密(数据)
打印(x)
返回
对于锈蚀:

extern板条箱openssl;
使用openssl::symm::decrypt;
使用openssl::symm::{encrypt,Cipher};
静态键:&'static[u8]=b“黄色潜水艇”;
fn main()->std::io::Result{
//不知道为什么这个OpenSSL调用不起作用。
让数据=b“\x09\x12\x30\xaa\xde\x3e\xb3\x30\xdb\xaa\x43\x58\xf8\x8d\x2a\x6c”;
设cipher=cipher::aes_128_ecb();
让new_data=解密(密码、密钥、无、数据);
println!(“错误{:?}”,新的_数据);
好(())
}

我希望看到这个函数以与python相同的方式解密字节字符串

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";
您将看到您的代码正确地解密了它


如果需要禁用填充,可以使用对象并对其()调用
.pad(false)

ECB模式当然不使用IV(它单独存在于Python代码中,可怜的IV)。OpenSSL在默认情况下总是期望PKCS#7兼容的填充。我修复了代码问题和关于初始化向量的误导性评论。谢谢你指出这些。请原谅这个愚蠢的问题,但是你是如何得到最后16个字节的?如果给定一个长度mod 16==0的文本文件,我希望在字节流的末尾需要一个填充。所以我不明白为什么最后一半不是10.txt中内容的延续,非常感谢。@jdim
printf“我回来了,我在”| openssl enc-aes-128-ecb-K 59454c4c4f570535424d4152494e45
。始终添加至少1字节的填充(启用时),即使长度可被块大小整除,因为否则解密时是否删除填充将不明确。已获得,根据。非常感谢。