ObjC AES128 使用二进制密钥加密



我正在尝试使用 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;
}

这个在线工具示例中的加密正是我所需要的。

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

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

我不认为你的意思是"十六进制",这是一个字符串表示。 我认为您的意思是"二进制",因此只需提供密钥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;
}

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

谢谢大家!

最新更新