我开发的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字节的密钥大小?非常感谢。
我是新手,我如何初始化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
这是一个C级的API,你可以在所有地方混合使用对象类型和枚举。我已经在上面添加了一个示例。如果你想知道应该给出什么类型的参数,只需按住Cmd键并单击函数名称即可转到头文件,并在参数类型上执行相同操作以查看选项。现在可以使用16字节密钥大小的 – Tark 2012-03-13 14:26:16
。我能做些什么来使用32字节的密钥大小? – pasqui86 2012-03-23 10:59:23