php - 将 AES-256-CBC PHP 代码转换为 Swift 与 PHP 的结果不匹配
问题描述
我无法使用CryptoSwift将代码从我的 PHP 后端转换为 Swift 。它是 AES-256-CBC,但要么我收到invalidKeySize
错误,要么产生的输出与预期的输出不匹配。
我的 PHP 代码是
$string = "MyStringToEncrypt";
$secret_key = sha1('MySecretKey');
$secret_iv = sha1('MySecretIV');
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hash( 'sha256', $secret_key );
$iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );
$output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ));
return $output;
据我所知,我需要一个 16 字节 IV 和一个 32 字节密钥,因为它是 256 加密。我用swift写这个的尝试是,
import CryptoSwift
let secretKey = "MySecretKey".sha1()
let secretIv = "MySecretIV".sha1()
let keyString: String = String(secretKey.sha256().prefix(32))
let ivString: String = String(secretIv.sha256().prefix(16))
let data = "MyStringToEncrypt".data(using: String.Encoding.utf8)
var result = ""
do {
let enc = try AES(key: key, iv: iv).encrypt(data!.bytes)
let encData = NSData(bytes: enc, length: Int(enc.count))
let base64String: String = encData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0));
result = String(base64String)
} catch {
print("Error \(error)")
}
这会给我一个 32 字节的密钥,但结果不是我从 PHP 获得的预期结果。如果我不添加,.prefix(32)
我不会得到 32 字节长度的密钥,这会产生无效的密钥大小错误。
解决方案
推荐阅读
- postgresql - 必须先提交新的枚举值,然后才能使用它们
- javascript - 模拟dayjs扩展
- python - 用列表替换数据框中的每个 Null 值
- go - 是否可以使用在其他地方生成的 Metamask 签署交易?
- angular - Spring(Spring Boot)如何向前端提供 CSRF 令牌?
- python-3.x - 在与 Raspberry Pi 连接时为 ADC 设置用户定义的采样率
- r - 在 R 中绘制多个波形图
- python - 比较列表中的两个二维列表,并打印不同的行。但没有一列
- mysql - 添加外键失败
- python - Python Datacompy:如何获得完整的比较报告?