首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES-128 OFB使用mcrypt (PHP)和pycryptodome (Python)不同

AES-128 OFB使用mcrypt (PHP)和pycryptodome (Python)不同
EN

Stack Overflow用户
提问于 2019-05-05 22:41:03
回答 1查看 345关注 0票数 1

免责声明:这里给出的所有示例都不是安全的,也不太接近于良好的实践。此处使用的代码将用于CTF挑战,并包含多个漏洞。

下面是我实际关注的问题:使用相同的密钥、iv、模式和使用mcrypt_encrypt填充加密的结果与在python2.7中使用Crypto.cipher AES进行加密不同,但仅在使用OFB模式时才使用。以下是我的例子:

代码语言:javascript
复制
$key = 'SUPER_SECRET_KEY';
$iv = '0000000000000000';
$data = "this is a test";
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_OFB, $iv));

结果是:k8Ss4ytOUNvcG96tr+rHdA==

下面是python示例:

代码语言:javascript
复制
from Crypto.Cipher import AES
from base64 import b64encode

key = 'SUPER_SECRET_KEY'
iv  = '0'*16
data = "this is a test"
padding = 16 - (len(data) % 16)
data += chr(padding)*padding
print(b64encode(AES.new(key, AES.MODE_OFB, iv).encrypt(data)))

结果是:kzFpEHCJB+2k2498DhyAMw==

它只发生在OFB模式下。如果我将模式更改为CBC (而不更改其他任何内容),则两个结果都是相同的。知道怎么回事吗?

编辑:在PHP中使用openssl_encrypt可以获得与python代码相同的结果。这使我相信mcrypt_encrypt中存在一个bug。

代码语言:javascript
复制
$key = "SUPER_SECRET_KEY";
$iv  = "0000000000000000";
$data = "this is a test";
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
$cipher = openssl_encrypt($data, "aes-128-ofb", $key, $options=OPENSSL_RAW_DATA, $iv);
echo base64_encode($cipher) ."\n";
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 01:04:55

我不知道你为什么要用mcrypt或OFB模式做任何事情--这两种模式都是来自过去的爆炸,大多数密码家都试图忘记。也不清楚为什么要为流模式使用填充,除非您正在处理PyCrypto错误(见下文)。

要直接回答您的问题,请参阅PHP文档:

MCRYPT_MODE_OFB (输出反馈,8位模式)是一种与循环流化床类似的流密码模式,但可用于不能容忍错误传播的应用场合。建议使用NOFB模式而不是OFB模式。

您可能应该使用:

MCRYPT_MODE_NOFB (输出反馈,n位模式)可与OFB模式相媲美,但在算法的全块大小上运行。

在"OFB“之前的"N”是操作模式的块大小。

PyCrypto、PyCryptoDome或OpenSSL都不存在这样的文档。但是,它们似乎一次处理128位(根据PyCrypto错误报告),因为由于某种原因,它不正确地要求接收完整的明文块。

OFB将产生不同的密文,如果使用8位或128位模式-除了第一个字节,这应该是相同的。8位模式与mcrypt或OFB本身一样是来自过去的爆炸;它使用每个字节的完整块加密(!)以减少错误传播。

如果您需要流模式,可以使用CTR模式,或者最好使用经过身份验证的密码,如GCM (在下面使用CTR模式)。这将是更快(超过8位OFB)和更安全。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55997028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档