【问题标题】:RNCryptor AES256 encryption and decryption in PHPPHP中的RNCryptor AES256加解密
【发布时间】:2012-11-18 09:22:04
【问题描述】:

我正在尝试使用RNCryptor 在 iOS 端进行 AES256 加密,并在 PHP 的远程站点进行 AES256 解密。但我无法使用 php 获得正确的解密数据。如果我做错了什么,请帮助检查。

下面是我的 iOS 代码。

 NSString *key = @"1234567890123456789012";
 NSData *encryptedData = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                        password:key
                                           error:&error];

然后我将 encryptedData 发布到 PHP 中的服务器。下面是我的 PHP 代码。

$key ="1234567890123456789012"  //32-bit key
$username = aes256Decrypt ($key, $username);

function aes256Decrypt($key, $data) {
    if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
    $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, 
                str_repeat("\0", 16));
    $padding = ord($data[strlen($data) - 1]);
    $result = substr($data, 0, -$padding);
    return substr($data, 0, -$padding);
}

【问题讨论】:

标签: php objective-c encryption aes rncryptor


【解决方案1】:

根据一些快速研究,RNCryptor 似乎有自己的output format。下面显示了一个示例(取自我链接的页面):

DESCRIPTION: | version/cryptor | options | encryptionSalt | HMACSalt |  IV   | ... ciphertext ... |   HMAC   |
 BYTE INDEX: |        0        |    1    |      2-9       |  10-17   | 18-33 | <-      ...     -> | n-32 - n |

在尝试解密之前,您的 PHP 代码必须从这种格式中提取数据。您需要 IV 值和密文才能检索原始明文。

或者,为 iOS 切换到不发明自己的数据格式的不同加密方法。

【讨论】:

  • 听起来不错。我使用 AES256EncryptWithKey 作为替代方案。它按我的预期工作。但是 AES256EncryptWithKey 方法存在严重的安全问题,正如此处所指出的 (stackoverflow.com/questions/9794383/…)。我想我需要弄清楚如何用我的 PHP 代码制作 RNCryptor。
  • 巴达克的回答。详情见here。 1.在iOS中使用较低级别的函数自己创建加密密钥和IV,以便以后在PHP中使用(但是,为什么首先使用RNCryptor)2.从PHP中的RNCryptor格式中提取这些部分并调用PHP解密与它的相关部分一起使用(注意您需要使用 PBKDF2 从 pass + salt 重新创建密钥)。 3. 或者你从iOS中的RNCryptor格式中提取出来单独提交(但是仍然需要通过pass + salt创建密钥)。
  • 请注意,任何正确使用 AES 都需要类似 RNCryptor 格式的输出格式。对所需数据进行编码没有好的标准。最接近的是 CMS,这是一种非常复杂的数据格式,会增加很多开销。每个人都创建自己的格式。 OpenSSL 有一个。 aescrypt 还有一个。这些都没有编码足够的数据来正确保护 AES,所以我不得不创建另一个。如果有包含所有必需部分的标准格式可用,我有兴趣切换到它。
  • 您最终是使用here 的解决方案之一还是使用新的加密/解密 API?我想知道如何做#2。从 PHP 中的 RNCryptor 格式中提取这些部分,并使用其相关部分调用 PHP 解密函数(注意您需要使用 PBKDF2 从 pass + salt 重新创建密钥)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2012-04-09
相关资源
最近更新 更多