使用二进制密钥的 ObjC AES128 加密

ObjC AES128 Encryption with binary key

我正在尝试使用 AES128 加密数据,我得到正确的输出,密钥被视为文本字符串,但只有垃圾尝试将密钥视为二进制文件。

我使用的实现是这样的:

- (NSData *)AES128EncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));

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

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

NSLog(@"keyPtr: %s", keyPtr);


size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0x00,
                                      keyPtr, kCCKeySizeAES256,
                                      NULL , [self bytes], dataLength, buffer, bufferSize,
                                      &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer);
return nil;
}

this online tool example中的加密正是我所需要的

通过我的实现,我得到了相同的明文密钥正确加密,但我找不到将密钥视为十六进制的方法。 试图修改上面的代码以获取密钥作为 NSData 但不起作用,加密后我只得到垃圾。

我搜索过但没有找到关于这个特定主题的答案,希望我做对了,TIA :)

我不认为你的意思是 "Hex",它是一个字符串表示。我想你的意思是 "binary",所以只需提供密钥 NSData:

- (NSData *)AES128EncryptWithKey:(NSData *)key {
    NSAssert([key length] >= kCCKeySizeAES256, @"Key too short");
    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    NSMutableData *encrypted = [NSMutableData dataWithCapacity:bufferSize];

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0x00,
                                          [key bytes], kCCKeySizeAES256,
                                          NULL , [self bytes], dataLength,
                                          [encrypted mutableBytes], bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        [encrypted setLength:numBytesEncrypted];
        return encrypted;
    }

    return nil;
}

注意:您的代码包含一次内存泄漏,我认为您没有正确返回加密数据。

修改木马代码解决,万分感谢!

- (NSData *)AES128EncryptWithKey:(NSData *)key {
NSAssert([key length] >= kCCKeySizeAES128, @"Key too short");
NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, ccPKCS7Padding,
                                      [key bytes], kCCKeySizeAES128,
                                      NULL , [self bytes], dataLength, buffer, bufferSize,
                                      &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer);
return nil;
}

有了这个,我得到了与那个在线工具相同的输出。 我知道它可能不安全,谢谢你的建议,但我只需要它供我自己使用,不会分发所以我唯一需要的是它能正常工作并输出与该工具相同的结果。

谢谢大家!