【问题标题】:AES256 encrypt in objective C to mach with php rijndael_256 ECB_MODEAES256 在目标 C 中加密以匹配 php rijndael 256 ECB 模式
【发布时间】:2014-11-30 23:18:24
【问题描述】:

我正在尝试在目标 C 中加密 AES256 中的 json 以发送到一台服务器并使用以下行 php 对其进行解密:

MCRYPT_DECRYPT (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ ha), MCRYPT_MODE_ECB, NULL));

花了几天时间搜索和测试,我还没有得到结果。我使用的代码是这样的:

- (NSString *)AES256EncryptData:(NSData *) datos {

    //NSData * datos = [json dataUsingEncoding:NSUTF8StringEncoding];

    UIApplication *aplicacion = [UIApplication sharedApplication];
    AppDelegate *delegate = (AppDelegate *) aplicacion.delegate;

    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [delegate.appKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding ];

    NSUInteger dataLength = [datos length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);


    size_t numBytesEncrypted;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionECBMode + kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCKeySizeAES256,
                                          NULL,
                                          [datos bytes],
                                          [datos length],
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);


    if (cryptStatus == kCCSuccess) {
        NSData *returnData  = [[NSData alloc] initWithBytes:buffer length:numBytesEncrypted];
        return [returnData base64EncodedStringWithOptions:0];
    }

    free(buffer);
    return nil;
}

【问题讨论】:

  • 是的,密钥长度为 32 字节。我已经更改了密钥类型,但结果是一样的。任何想法设置填充?我测试的所有内容都是错误的,结果为 NULL
  • 我发现我可以用 Rijndael_128 而不是 Rijndael_256 解密 PHP 中的结果。

标签: php ios encryption aes


【解决方案1】:

根据您使用的加密算法,您可以永远尝试。您当前正在使用MCRYPT_RIJNDAEL_256,这是具有 256 个块大小的 Rijndael 块密码。您应该使用MCRYPT_RIJNDAEL_128(也称为AES),然后执行PKCS#7 unpadding yourself

您确实也应该提供正确数量的密钥字节,对于 AES,这应该是 16、24 或 32 字节。关键字节显然必须与您在 C# 代码中使用的字节匹配。


如果您无法更改服务器代码,您应该为 IOS 制作/编译 mcrypt 并为该特定 API 实现相同的功能。至少它会兼容。不幸的是,您似乎必须do the porting yourself

【讨论】:

  • 问题是我无法更改服务器配置
  • 更改了答案,请给服务器开发者一个好主意,他们的代码不安全,也没有使用任何标准密码学。
  • 这方面有什么进展吗?我知道这或多或少是一个“否定”的答案,但恐怕这不是我可以改变的。
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2012-05-06
  • 2017-08-08
  • 2011-03-26
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多