简体   繁体   English

AES解密iOS

[英]AES Decryption iOS

I try to decrypt a String message with AES decryption. 我尝试使用AES解密来解密String消息。

- (NSData *)AES256DecryptWithKey:(NSString *)key andIV:(NSString*)iv{

// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)

// fetch key data
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES256,
                                      //[iv cStringUsingEncoding:NSUTF8StringEncoding] /* initialization vector (optional) */,
                                      NULL,
                                      [self bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesDecrypted );

if( cryptStatus == kCCSuccess )
{
    NSLog(@"CRYPTSTATUS %d",cryptStatus);

    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

NSLog(@"CRYPTSTATUS %d",cryptStatus);


free( buffer ); //free the buffer
return nil;

} }

But the Result is truncated, do anyone have a suggestion? 但是结果被截断了,有人建议吗? It seems to be a problem with the padding, but I dont know. 填充似乎有问题,但我不知道。 The AES key will be later (RSA encrypted) send. 稍后将发送AES密钥(RSA加密)。

Would be nice if you could give me suggestions. 如果您能给我建议,那就太好了。

EDIT: Input (base64 encoded) 编辑:输入(base64编码)

NSData *keydata = [[NSData alloc]initWithBase64EncodedString:@"QUFBQUE5MThEOTMyOEJCQkJCQkJCODhFMTM3MURFREQ="];
NSString *key = [[NSString alloc]initWithData:keydata encoding:NSUTF8StringEncoding];

NSData *msgnormal = [[NSData alloc]initWithBase64EncodedString:@"oE4LOCjOfjPeggXsDbLQ4ko+57kdb/5EBUcmlTBvaaI="];
NSData *decrypted = [msgnormal AES256DecryptWithKey:key andIV:@""];

NSLog(@"DECRYPTED: %@",[[NSString alloc]initWithData:decrypted encoding:NSUTF8StringEncoding]);

The input should be padded to the nearest block also. 输入也应填充到最近的块。 If the input ends on a block boundary, you actually still add a whole other block just so you always have padding (that you will remove later). 如果输入在块边界处结束,则实际上您仍会添加整个其他块,以便始终具有填充(稍后将删除)。

You must know where the end of the decrypted text is and where the padding starts. 您必须知道解密文本的结尾在哪里以及填充的开始位置。 Typically, this is handled with padding such as PKCS7 . 通常,这是通过诸如PKCS7之类的填充来处理的。 Since you will know how many bytes are the padding, it's easy to strip off later. 由于您将知道填充的字节数,因此以后很容易剥离。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM