我试图用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:)
答案 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;
}
有了这个,我获得与该在线工具相同的输出。 我知道这可能是不安全的,感谢你的建议,但我只需要我自己使用它,不会被分发,所以我需要的是它能正常工作并输出与该工具相同的结果。
谢谢大家!