Objective-C解密AES 128 cbchexstring
我正在开发Snow Leopard上的iPhone应用程序,使用Xcode 3.1从一个宁静的Web服务接收一个带有algorithmAES 128位(CBC)的hex格式的encryption文本。 该algorithm使用初始化向量+秘密密钥。 我如何解密这个文本? 感谢大家的提示,我会成功给予。
编辑:我从REST服务器以hex和encryption格式得到响应,我尝试使用此代码,但我总是收到错误的参数错误。 你能帮我find错误吗? 是否有可能我首先将string响应转换为二进制格式?
NSString *response = [request responseString]; NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; NSString *key = @"32charlength"; NSString *iv = @"16charlength"; NSData *unencryptedData = NULL; size_t unencryptedLength = [unencryptedData length]; CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, iv, [encryptedData bytes], [encryptedData length], unencryptedData, [encryptedData length], &unencryptedLength); NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; if (ccStatus == kCCSuccess) risultato.text = @"SUCCESS"; else if (ccStatus == kCCParamError) risultato.text = @"BAD PARAM"; else if (ccStatus == kCCBufferTooSmall) risultato.text = @"BUFFER TOO SMALL"; else if (ccStatus == kCCMemoryFailure) risultato.text = @"MEMORY FAILURE"; else if (ccStatus == kCCAlignmentError) risultato.text = @"ALIGNMENT"; else if (ccStatus == kCCDecodeError) risultato.text = @"DECODE ERROR"; else if (ccStatus == kCCUnimplemented) risultato.text = @"UNIMPLEMENTED";
EDIT2:这个函数返回BAD PARAM,因为在分配解密数据时没有正确的缓冲区大小。 我以这种工作方式编辑function:
NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; const void *key = @"32charlength; uint8_t *iv = @"16charlength"; char buffer[4*4096]; memset(buffer, '\0', sizeof(buffer)); size_t size = sizeof(buffer); CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, iv, [encryptedData bytes], [encryptedData length], buffer, sizeof(buffer), &size);
这个function为我工作..非常感谢。
编辑23三月——
现在系统工作以16字节的密钥大小形成我。 现在我有一个问题,我能做些什么来实现32字节的密钥大小? 非常感谢。
这可以使用<CommonCrypto/CommonCryptor.h>
头文件中包含的CCCryptor
函数。 检查man CCCryptor
的血淋淋的细节,在你的情况下,它听起来像你可以使用一个单一的CCCrypt()
来解码接收到的数据:
CCCryptorStatus CCCrypt(CCOperation op, CCAlgorithm alg, CCOptions options, const void *key, size_t keyLength, const void *iv, const void *dataIn, size_t dataInLength, void *dataOut, size_t dataOutAvailable, size_t *dataOutMoved);
假设你有在NSData *encryptedData
解密的数据,你可以尝试这样的:
char * key = "shouldbe16chars."; NSUInteger dataLength = [encryptedData length]; uint8_t unencryptedData[dataLength + kCCKeySizeAES128]; size_t unencryptedLength; CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, NULL, [encryptedData bytes], dataLength, unencryptedData, dataLength, &unencryptedLength); NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding];
这是未经testing的,请确保您检查CCCrypt
的返回值的错误。 检查头文件的细节,它是有据可查的。
- 如何对swift XCODE上的string进行AES 128encryption并将其作为POST发送给服务器?
- 在iOS 7中,AES解密在iOS 8/9中具有不同的行为
- PHP服务器和iOS上的AES Rijndael生成有时不同的密码
- AES在iOS(Obj-C)和Android(Java)中获得了不同的结果
- Swift(iOS)和PHP中AES256encryption的结果不同
- iOSencryptionAES128 / CBC / nopadding为什么不能正常工作?
- 在iOS中创build随机的128位AESencryption密钥
- AESencryption和解密
- AESencryption在iOS和Android中造成不同的结果