【发布时间】:2011-11-09 12:45:45
【问题描述】:
我的 Objective-C 应用程序需要文本/字符串加密(特别是 nsstring)。
我知道 AES 是可供消费者使用的最安全的加密方法。我也了解如何将字符串转换为数据并返回......(只是一个初学者)。
许多关于 AES 加密的网页和 Q/As 都不清楚,并且没有一个说明如何使用给定的代码。例如,一个网页可能会说:“这是代码……这是它的作用……”但没有解释如何使用它。
我通过大量研究找到了这段代码:
#import "<CommonCrypto/CommonCryptor.h>"
@implementation NSMutableData(AES)
对于加密:
- (NSMutableData*) EncryptAES:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1];
bzero( keyPtr, sizeof(keyPtr) );
[key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF16StringEncoding];
size_t numBytesEncrypted = 0;
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
NSMutableData *output = [[NSData alloc] init];
CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL, [self mutableBytes], [self length], buffer, bufferSize, &numBytesEncrypted);
output = [NSMutableData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
if(result == kCCSuccess) {
return output;
}
return NULL;
}
用于解密:
- (NSMutableData*)DecryptAES: (NSString*)key andForData:(NSMutableData*)objEncryptedData {
char keyPtr[kCCKeySizeAES256+1];
bzero( keyPtr, sizeof(keyPtr) );
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF16StringEncoding];
size_t numBytesEncrypted = 0;
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer_decrypt = malloc(bufferSize);
NSMutableData *output_decrypt = [[NSData alloc] init];
CCCryptorStatus result = CCCrypt(kCCDecrypt , kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL, [self mutableBytes], [self length], buffer_decrypt, bufferSize, &numBytesEncrypted);
output_decrypt = [NSMutableData dataWithBytesNoCopy:buffer_decrypt length:numBytesEncrypted];
if(result == kCCSuccess) {
return output_decrypt;
}
return NULL;
}
}
这是我自己做的代码,想和上面的代码对应起来:
- (void)Encrypt {
//Convert NSString to NSData so that it can be used to encrypt the Input
NSString *Input = [Inputbox text];
NSData *InputData = [Input dataUsingEncoding:NSUTF8StringEncoding];
//What to do here
}
我如何使用这段代码,这些方法?它在我的实施文件中的什么位置?
【问题讨论】:
-
嗨@RazorSharp - 已将您的问题迁移到此处(堆栈溢出)。关于使任何类型的代码工作的问题,加密或其他方式最好在这里回答,因为这里有大量可以提供帮助的人,但是如果您想询问所使用的任何算法、填充等的详细信息,那么加密是它的地方!
-
要牢记的一个重要设计考虑因素是加密算法只是解决方案的一部分。密钥管理非常重要,很容易成为系统中的最薄弱环节。有一些关于这类事情的好书(例如 Schneier),还有很多关于设计的文章。现在的一些研究可能会在以后节省大量工作。
-
使用 github.com/Gurpartap/AESCrypt-ObjC 进行快速 AES-256-CBC 密码和基于 Base64 编码的加密/解密。您可以在设备外处理(服务器等)上使用相同的密码和编码。
-
结果 != kCCSuccess 时可能缺少 free(buffer) / free(buffer_decrypt)?
标签: nsstring objective-c encryption cryptography aes