当前位置: 首页 > 知识库问答 >
问题:

PHP AES256加密=>RNCryptor RNDecryptor返回空白/HMAC不匹配

廖令
2023-03-14

使用PHP 5.4 (mcrypt),RNCryptor 2,iOS 6。

PHP函数使用从https://github.com/rnapier/RNCryptor/wiki/Data-Format.

PHP解密函数可以解密RNEncryptor中的base64字符串,下面的PHP Encrypt函数按预期返回数据。

当使用RNDecryptor和base64从下面的PHP Encrypt函数时,不会返回任何数据,如下面的XCode输出所示。

PHP函数:

function encrypt($data, $key)
{
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    $salt = '12345678';

    $_key = $this->pbkdf2('SHA1', $key, $salt, 10000, 32, true);

    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $_key, $data, MCRYPT_MODE_CBC, $iv);

    $hmac = $this->pbkdf2('SHA1', $key, $salt, 10000, 32, true);

    $data = mb_convert_encoding(chr(1).chr(0).$salt.$salt.$iv.$ciphertext.$hmac, "BASE64", "UTF-8");

    return $data;
}

PHP函数调用:

encrypt('My Data', 'mykey');

iOS:

NSError * error;
NSData *decryptedData = [RNDecryptor decryptData:[NSString base64DataFromString:@"AQBpcGhvbmU2MmlwaG9uZTYyrYk2rJnaoywktnx6TZ4X3YKgYuEHCL1EHv+/MqIvQMq5BmZOyMJr QSRs9P4uxShsOJOg67VYniUGhHbFNTSl1Q=="]
                                    withPassword:@"mykey"
                                           error:&error];

NSLog(@"data = %@, %@", decryptedData, error);

XCode输出:

数据=

这是当我在RNDecryptor中注释掉HMAC验证时完成的,一旦这些部分未注释,我就会收到HMAC不匹配错误。

data=(null), Error Domain=net.robnapier.RNCryptManagerCode=1"HMAC不匹配"UserInfo=0x1e564280{NSLocalizedDescription=HMAC不匹配}

if (self.hasHMAC) {
  NSMutableData *HMACData = [NSMutableData dataWithLength:self.HMACLength];
  CCHmacFinal(&_HMACContext, [HMACData mutableBytes]);

  if (![HMACData isEqualToData:self.inData]) {
    [self cleanupAndNotifyWithError:[NSError errorWithDomain:kRNCryptorErrorDomain
                                                        code:kRNCryptorHMACMismatch
                                                    userInfo:[NSDictionary dictionaryWithObject:@"HMAC Mismatch"
                                                                                         forKey:NSLocalizedDescriptionKey]]];
    return;
  }
}

共有2个答案

芮安顺
2023-03-14

这个问题是由于不正确的HMAC(传递HMAC密钥)和PHP加密需要在要加密的数据上填充PKCS7(不是IV)。

最终的PHP函数…

function AES256Encrypt($data, $key)
{
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = $block - (strlen($data) % $block);
    $data .= str_repeat(chr($pad), $pad);

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    $keySalt = '12345678';
    $hmacSalt = '12345678';

    $_key = $this->pbkdf2('SHA1', $key, $keySalt, 10000, 32, true);
    $_hmacKey = $this->pbkdf2('SHA1', $key, $hmacSalt, 10000, 32, true);

    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $_key, $data, MCRYPT_MODE_CBC, $iv);

    $data = base64_encode(chr(1).chr(0).$keySalt.$hmacSalt.$iv.$ciphertext.hash_hmac('SHA256',$ciphertext,$_hmacKey, true));
    return $data;
}
刘和玉
2023-03-14

< code > MB _ convert _ encoding()将进行base64转换,但它将输出分块的base64。

PHP base64解码器将接受分块和分块,但iOS…?

也许您只需要编码:

$data = base64_encode(chr(1).chr(0).$salt.$salt.$iv.$ciphertext.$hmac);

您可能想查看 iOS/PHP kCC解码错误以获取另一种实现。

最后,从RNCryptor Wiki数据格式中,我看到了(连同指向Stack Overflow上PHP实现的链接)

HMAC是使用密文和HMACKey(如上)以及SHA-256 PRF生成的。

...但是你附加的HMAC在我看来实际上是HMAC密钥,而不是HMAC...?

 类似资料:
  • 我正在构建我的第一个Spring Boot应用程序。但是我不能正确地得到我的requestMapping控制器的回答。 这是我的主要课程: 这是我的RestController: 如果我看一下日志,我可以看到“/hi”映射: 但是当我访问:http:localhost:8080/hi时,我看到了一个空白页面,我期望看到“Hello World”文本。 为什么我得到一个空白页面? ---编辑----

  • 问题内容: 我有一个看起来像这样的JSON Blob 我有一些代码将其转换回go结构 但是我在运行时看到的只是一个零位结构 我尝试先分配该结构,但那也没有用,我不确定为什么它不产生值,并且不返回错误 问题答案: 您的结构字段不会导出。这是因为它们以小写字母开头。 当我说“未导出”时,是指它们在您的包装之外不可见。您的软件包可以愉快地访问它们,因为它们在本地作用域内。 至于包装-它看不到它们。您需要

  • 问题内容: 我想上传图像文件,将它们绘制到画布中,进行更改并将其保存在数据库中。我尝试测试画布图像()返回的base64值,该值为空白。但是,当我将canvas()附加到文档时,会看到结果。我在这里做错了什么? 问题答案: 我的直觉说,所有内容都应纳入功能中。 这意味着,在相关部分,代码变为: 原因是行 加载图像后正确执行。但不幸的是,执行此行时,您不必等待加载: 和所有后续行。 需要加载图像才能

  • 我对REST编程很陌生。 下面是我的类,它打算返回XML/JSON,但我很难让它返回正确的值。我尝试返回我的POJO类的Response、JsonArray和Object,但没有成功。我看了好几条线索,但都搞不清到底是什么问题。 资源类: POJO类: 这是我返回响应或朋友对象时得到的: 当返回< code>JsonArray时,我得到的是: 我面临的另一个问题是:如果我创建一个构造函数,我得到以

  • 问题内容: 我正在使用glfx.js编辑我的图像,但是当我尝试使用函数获取该图像的数据时,我得到了一个空白图像(宽度与原始图像相同)。 奇怪的是,在Chrome中,脚本可以完美运行。 我要提及的是,使用onload事件加载了图像: 另外,我的图片路径在同一域中; 问题(在Firefox中)是当我按下“保存”按钮时。Chrome返回预期结果,但Firefox返回以下结果: 是什么导致此结果,如何解决