gpt4 book ai didi

iphone - 使用 Objective C 的 AES 解密

转载 作者:行者123 更新时间:2023-11-29 11:12:57 26 4
gpt4 key购买 nike

我使用下面的代码来解密一个加密的文件,该文件是使用 JAVA 应用程序加密的。

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

密码.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

这是我解码加密数据的方式:

- (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 代码生成的。如果您对该代码有任何控制权,那么您应该明白它使用的协议(protocol)是高度不安全的。它不能正确生成 key (MD5 不是一个好的 PBKDF),也不能正确生成 IV。加上缺少 HMAC,它容易受到多种攻击。参见 Properly encrypting with AES with CommonCrypto有关如何正确设置这些的完整详细信息,以及 RNCryptor enter link description here示例实现。

对于您的具体问题,您是在解密此加密的内容时遇到问题,还是在解密 Java 加密的内容时遇到问题?您可能与 Java 不匹配。

您应该检查错误是否出现在更新或最终步骤中。如果是更新步骤,则说明您配置不正确。如果是最后一步,您应该首先确保填充正确。文档的末尾应该是 PKCS#7 填充。这意味着它应该以下列序列之一结束(除非解密后的大小可以被 16 整除):

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

整个加密数据的最终大小应该能被16整除。

关于iphone - 使用 Objective C 的 AES 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10701590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com