在Flutter中加密字符串,在PHP中解密



我正试图将加密数据从我的Flutter应用程序发送到我的PHP服务器,但我遇到了PHP服务器上解密的问题。我使用Dart中的Encrypt包用AES加密算法加密数据,然后将其发送到PHP服务器,在那里我使用OpenSSL解密数据。

这是我用来加密数据的Dart代码:

import 'package:encrypt/encrypt.dart' as encrypt;
void main() async {
var plainText='test';
final key = encrypt.Key.fromUtf8('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
final iv  = encrypt.IV.fromUtf8('AAAAAAAAAAAAAAAA');
final encrypter = encrypt.Encrypter(encrypt.AES(key));
final encrypted = encrypter.encrypt(plainText, iv: iv);
print(encrypted.base64);
}

此代码输出"VBnTmnNX14Sbxqu99PMtWw=="。

在PHP端,我使用以下代码来解密数据:

// The encrypted string
$encrypted = "VBnTmnNX14Sbxqu99PMtWw==";
// The encryption key and initialization vector (IV)
$key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
$iv = "AAAAAAAAAAAAAAAA";
// Decrypt the string
$decrypted = openssl_decrypt(base64_decode($encrypted), 'AES-192-CBC', $key, OPENSSL_RAW_DATA, $iv);
// Output the decrypted string
echo var_dump($decrypted);

输出"bool(false)"这意味着加密失败了。

为什么会失败,你知道吗?

使用的密钥是32字节,因此必须在PHP端应用AES-256。此外,Dart端自动使用CTR模式(相当于SIC模式,这是Dart端的默认模式),在PHP端需要AES-256-CTR(而不是AES-192-CBC)。

请注意,Dart代码应用pkcs# 7填充(对于像CTR这样的流密码模式,实际上不需要填充)。在PHP端,对于CTR,隐式地禁用填充。因此,填充字节不会被删除。正确的修复方法是在Dart一侧禁用CTR的填充(参见这里的No/zero padding一节)。

还要注意,所使用的密钥和IV(以及静态IV)都是漏洞(除非它们仅用于测试目的)。

最新更新