ios - AES 解密互​​操作性 IOS 和 Python

标签 ios objective-c aes

我正在尝试使用 AES 256 CFB 模式解密在 Python 中加密的文件。

当我尝试在 IOS 中解密它时,它无法解密。给一些垃圾字符串。

NSString * AES_Decrypt(NSString * key, NSString * cipherText,NSString *iv)
{
    @autoreleasepool {
    NSMutableData * mutableCipher = [[NSMutableData alloc] init];
    mutableCipher = (NSMutableData *)[cipherText dataUsingEncoding:NSUTF8StringEncoding];
    char  keyPtr[kCCKeySizeAES256+1];
    bzero( keyPtr, sizeof(keyPtr) );
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding];
    uint8_t iv[kCCKeySizeAES128+1];
    bzero((void *) iv, (size_t) sizeof(iv));      
    size_t numBytesEncrypted = 0;     
    NSUInteger dataLength = [mutableCipher length];
    size_t bufferSize = dataLength + kCCKeySizeAES128;       
    void *buffer_decrypt = malloc(bufferSize);        
    NSMutableData * output_decrypt = [[NSMutableData alloc] init];        
    CCCryptorStatus result = CCCrypt(kCCDecrypt , kCCAlgorithmAES128, kCCModeCFB, keyPtr, kCCKeySizeAES128, iv, [mutableCipher mutableBytes] , [mutableCipher length], buffer_decrypt, bufferSize, &numBytesEncrypted);       
    output_decrypt = [NSMutableData dataWithBytesNoCopy:buffer_decrypt length:numBytesEncrypted];
    NSString * decryptedStr = [[NSString alloc] initWithData:output_decrypt encoding:NSASCIIStringEncoding];
    NSLog(@"Decrypted String is::%@",decryptedStr);
    if(result == kCCSuccess){
        return decryptedStr;
    }
    else{
        return NULL;
    }

}
return NULL;
}

我使用以下参数调用它。

AES_Decrypt(@"d5a75c3377fbd50a24ae372c787d598b633e82f4210f90dfc8e618c47811d812", @"”l*®*ŸÂ€­Û»†.Sì’±—ë", @"3d396f81a3443ca44ce146c91a81d3d8");

但是该方法的输出没有返回预期的输出。谁能帮我解决这个问题。

最佳答案

您不能以这种方式将任意数据编码为 NSString。并非每个数据序列都是合法的 UTF8 字符串。

您传递的 key 不正确。您传递的 key 是 512 位长(64 字节大小的字符)。您正在获取其中的前 256 位,但这些位几乎肯定不是您要传递的 key (看起来您的意思是 key 采用十六进制格式;但您没有解码十六进制)。

您忽略了传递给您的 IV,而只是使用由零组成的 IV。

最后您将数据转换为 ASCII 字符串,但 ASCII 无法编码任意数据字符串。

加密不仅仅是调用 CCCrypt()。如果您想要一个同时使用 Cocoa 和 Python 实现处理此问题的加密库,请参阅 RNCryptor .

(我知道这不是如何正确编写此代码的完整答案,但正确的加密实际上是一个相当复杂的主题,您应该避免尝试从头开始编写。正如您在此处看到的,它非常简单错误地做很多事情,非常小的错误会完全破坏你的安全。我在编写 RNCryptor 时非常小心,我仍然不得不多次修改它来修复安全错误。所以我强烈建议使用高-级框架,而不是尝试使用 CommonCryptor 等低级组件构建加密解决方案。)

关于ios - AES 解密互​​操作性 IOS 和 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19427816/

相关文章:

ios - 奥林巴斯相机套件 : App exits when it draws face detection frame on the live view

iphone - 使用 MPVolumeView 时总是出现系统音量扬声器图标

c# - C#(加密)与Java(解密)之间的AES加密/解密

security - 如何保护加密 key 免遭逆向工程?

ios - 单元格标签无法捕获表格 View 中的值

ios - iphone 中的锁定方向问题

objective-c - KVC 和属性有什么区别?

iphone - 如何制作可扩展的 UITableViewCell

ios - 在 iOS 中暂停动画( Objective-C )

php - PHP通过CBC实现密文窃取(CTS)