OGeek|极客世界-中国程序员成长平台

标题: ios - 在 Objective C 中解密 AES-256-CBC [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 10:28
标题: ios - 在 Objective C 中解密 AES-256-CBC

我正在构建一个 iPhone 应用程序,它通过 JSON 从 PHP 后端获取解密的字符串。

在 PHP 中,我像这样加密字符串:

$encrypt_method = "AES-256-CBC";
    $secret_key = 'This is my secret key';
    $secret_iv = 'This is my secret iv';

    // hash
    $key = hash('sha256', $secret_key);

    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
    $iv = substr(hash('sha256', $secret_iv), 0, 16);

    if( $action == 'encrypt' ) {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    }

在 Objective C 中,我尝试使用 BBEAS 解密此字符串:https://github.com/benoitsan/BBAES

这是我在 Objective C 中得到的代码:

   NSData* salt = [BBAES IVFromString"This is my secret iv"];

    NSData *key = [BBAES keyBySaltingPassword"This is my secret key" salt:salt keySize:BBAESKeySize256 numberOfIterations:BBAESPBKDF2DefaultIterationsCount];
 NSData *decryptedMessage = [BBAES decryptedDataFromString"RlVnd01XOE5teTNseDFGQ3JScVhkQT09" IV:salt key:key];
    NSLog(@"Decrypted message: %@", decryptedMessage);

日志现在只显示一个空对象。

我找到了 C# 的重复帖子:How to decrypt an AES-256-CBC encrypted string

编辑: 可以说我可以调整 PHP 中的编码。我应该如何加密 PHP 中的字符串以在 Objective C 中解密?



Best Answer-推荐答案


您在 PHP 中所做的事情与在 iOS 中不同。我不熟悉这个 BBAES 框架,但您似乎拥有一个密码,您使用 PBKDF key 派生从中生成 256 位 AES key ,并使用它来解密数据。 但是,在 PHP 中,您正在对密码进行哈希处理并使用它来加密您的数据,因此您可能使用不同的 AES key 进行加密和解密。我也不确定 IV 是否匹配。

你应该做的是:

在 PHP 中,为您执行的每次加密生成一个随机的 16 字节 IV,并使用 PBKDF key 派生从您的密码生成 256 位 AES key 。请记住,盐和迭代次数在 PHP 和 iOS 中必须相同。加密后,将IV附加到加密数据后发送。

在 iOS 中,从收到的密文(最后 16 个字节)中提取 IV,使用相同的盐和迭代次数之前的相同方式从密码生成 AES key ,然后解密数据(没有 16最后的字节IV)

编辑:

正如@Zaph 指出的那样,我忘了提到您也应该使用相同类型的填充。 BBAES 似乎使用 PKCS7 填充。

关于ios - 在 Objective C 中解密 AES-256-CBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427780/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4