ios - 在 Objective C 中解密 AES-256-CBC

标签 ios objective-c encryption cryptography

我正在构建一个 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 中解密?

最佳答案

您在 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/

相关文章:

ios - afnetworking 3.0 迁移 : how to POST with headers and HTTP Body

ios - 如何在 SwiftUI 中创建 GridView ?

ios - 无法使用 setPitchEnabled 将其值更改为 YES

iphone - 使用 NSFileManager 的 copyItemAtURL 将图像从 iOS 设备的照片应用程序复制到我自己的应用程序目录

ios - 如何在子类中重新实现属性 getter 方法?

ios - 如何从 Camera ios 拍摄多张图像

php - 如何加密数据以便用LIKE执行SQL查询?

ios - NavigationLink、isActive 在 SwiftUI 中不起作用

iphone - Archiver 在 iPhone 上不使用加密保护 SQLite 数据

java - 密码分析 : XOR of two plaintext files