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

时间:2015-03-16 13:43:32

标签: objective-c encryption aes

我试图用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:)

2 个答案:

答案 0 :(得分:1)

我不认为你的意思是“Hex”,这是一个字符串表示。我认为你的意思是“二进制”,所以只需提供密钥为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;
}

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

答案 1 :(得分:0)

解决修改trojanfoe的代码,非常感谢!

- (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;
}

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

谢谢大家!