2012-03-13 44 views
2

我开发的iPhone上雪豹在Xcode 3.1从RESTful Web服务接收十六进制格式的算法AES 128位(CBC)加密文本的应用程序。该算法使用初始化向量+秘密密钥。我如何解密这段文字?感谢大家提供的成功提示。Objective-C的解密AES 128 CBC十六进制字符串

编辑: 我从REST服务器以十六进制和加密格式获得响应,我尝试使用此代码,但我总是收到错误的参数错误。你能帮我找到错误吗? 是否有可能我首先将字符串响应转换为二进制格式?

 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因为没有合适缓冲区大小,其中分配解密数据。我编辑在这个工作方式的功能:

 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); 

这个功能为我工作..非常感谢。

编辑3月23日------

目前,该系统的工作形成我16字节的密钥大小。现在我有一个问题,我能做些什么来实现32字节的密钥大小?非常感谢。

回答

2

这是可能的使用包括在<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]; 

这是未经测试,请务必检查的CCCrypt返回值的错误。检查头文件的细节,它是有据可查的。

+0

我是新手,我如何初始化var?我试试这个: NSString * hex = [NSString stringWithFormat:@“%@”,response]; CCOperation * op =“decrypt”; CCAlgorithm * alg = @“AES”; CCOptions * options = NULL; const void * key =“xxxx”; size_t * keyLength = [密钥长度]; const void * iv = @“xxxxxxxx-x-xxxxx”; size_t dataInLength = [hex length]; void * dataOut = response; size_t dataOutAvailable = 10000; size_t * dataOutMoved = NULL; CCCrypt(op,alg,options,key,keyLength,iv,hex,dataInLength,dataOut,dataOutAvailable,dataOutMoved); – pasqui86 2012-03-13 13:58:13

+0

这是一个C级的API,你可以在所有地方混合使用对象类型和枚举。我已经在上面添加了一个示例。如果你想知道应该给出什么类型的参数,只需按住Cmd键并单击函数名称即可转到头文件,并在参数类型上执行相同操作以查看选项。现在可以使用16字节密钥大小的 – Tark 2012-03-13 14:26:16

+0

。我能做些什么来使用32字节的密钥大小? – pasqui86 2012-03-23 10:59:23

相关问题