AES解密使用ObjectiveC

我使用下面的代码来解密encryption的文件,使用JAVA应用程序对文件进行encryption。

Cipher.h文件

#import <Foundation/Foundation.h> #import <CommonCrypto/CommonCryptor.h> #import <CommonCrypto/CommonDigest.h> @interface Cipher : NSObject { NSString *cipherKey; } @property (retain) NSString *cipherKey; - (Cipher *) initWithKey:(NSString *) key; - (NSData *) encrypt:(NSData *) plainText; - (NSData *) decrypt:(NSData *) cipherText; - (NSData *) transform:(CCOperation) encryptOrDecrypt data:(NSData *) inputData; + (NSData *) md5:(NSString *) stringToHash; @end 

Cipher.m文件

 #import "Cipher.h" @implementation Cipher @synthesize cipherKey; - (Cipher *) initWithKey:(NSString *) key { self = [super init]; if (self) { [self setCipherKey:key]; } return self; } - (NSData *) encrypt:(NSData *) plainText { return [self transform:kCCEncrypt data:plainText]; } - (NSData *) decrypt:(NSData *) cipherText { NSData *returnData = [[NSData alloc] init]; returnData = [self transform:kCCDecrypt data:cipherText]; return returnData; } - (NSData *) transform:(CCOperation) encryptOrDecrypt data:(NSData *) inputData { // kCCKeySizeAES128 = 16 bytes // CC_MD5_DIGEST_LENGTH = 16 bytes NSData* secretKey = [Cipher md5:cipherKey]; CCCryptorRef cryptor = NULL; CCCryptorStatus status = kCCSuccess; uint8_t iv[kCCBlockSizeAES128]; memset((void *) iv, 0x0, (size_t) sizeof(iv)); status = CCCryptorCreate(encryptOrDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [secretKey bytes], kCCKeySizeAES128, iv, &cryptor); if (status != kCCSuccess) { return nil; } size_t bufsize = CCCryptorGetOutputLength(cryptor, (size_t)[inputData length], true); void * buf = malloc(bufsize * sizeof(uint8_t)); memset(buf, 0x0, bufsize); size_t bufused = 0; size_t bytesTotal = 0; status = CCCryptorUpdate(cryptor, [inputData bytes], (size_t)[inputData length], buf, bufsize, &bufused); if (status != kCCSuccess) { free(buf); CCCryptorRelease(cryptor); return nil; } bytesTotal += bufused; status = CCCryptorFinal(cryptor, buf + bufused, bufsize - bufused, &bufused); NSLog(@"Status-3: %d", status); if (status != kCCSuccess) { free(buf); CCCryptorRelease(cryptor); return nil; } bytesTotal += bufused; CCCryptorRelease(cryptor); return [NSData dataWithBytesNoCopy:buf length:bytesTotal]; } + (NSData *) md5:(NSString *) stringToHash { const char *src = [stringToHash UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(src, strlen(src), result); return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH]; } @end 

这是我如何解码encryption的数据:

 - (void)viewDidLoad { [super viewDidLoad]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory1 = [paths objectAtIndex:0]; NSString *getImagePath = [documentsDirectory1 stringByAppendingPathComponent:@"Blue.jpg"]; NSData *objNSData1 = [NSData dataWithContentsOfFile:getImagePath]; Cipher *objCipher= [[Cipher alloc] initWithKey:@"1234567891234567"]; NSData *decryptedData = [[NSData alloc] init]; decryptedData = [objCipher decrypt:objNSData1]; NSLog(@"%@", decryptedData); myImage.image = [UIImage imageWithData:decryptedData]; } 

解密不成功,它返回4304错误。

我知道这是由Java代码生成的。 如果你对这段代码有任何控制,那么你应该明白它使用的协议是非常不安全的。 它不能正确生成一个密钥(MD5不是一个好的PBKDF),并且不能正确生成一个IV。 再加上缺less一个HMAC,它会受到几种攻击。 请参阅使用CommonCrypto的AES进行正确encryption,了解有关如何正确设置这些内容的完整详细信息,以及RNCryptor 在此处input链接描述以获取示例实现。

对于您的具体问题,您是否无法解密这个encryption的东西,或者您无法解密Javaencryption的东西? 您可能与Java不匹配。

你应该检查错误是在更新还是最后一步。 如果更新步骤,那么你已经错误地configuration了一些东西。 如果最后一步,你应该开始确保你的填充是正确的。 文档的末尾应该是PKCS#7填充。 这意味着它应该以下面的一个序列结束(除非解密的大小可以被16整除):

 01 02 02 03 03 03 04 04 04 04 ... 

整个encryption数据的最终大小应该可以被16整除。