Sam*_*cer 11 encryption cryptography aes objective-c
我的Objective-C应用程序需要文本/字符串加密(特别是nsstring).
我知道AES是最安全的加密方法,可供消费者使用.我也理解如何将字符串转换为数据并返回...(只是初学者).
许多关于使用AES加密的网页和Q/As都不清楚,并且没有一个说明如何使用给定的代码.例如,一个网页可能会说:"这里是代码......这是它的作用......"但没有解释如何使用它.
我通过大量研究找到了这段代码:
#import "<CommonCrypto/CommonCryptor.h>"
@implementation NSMutableData(AES)
Run Code Online (Sandbox Code Playgroud)
对于加密:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
对于解密:
- (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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我制作的代码,我想与上面的代码对应:
- (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
}
Run Code Online (Sandbox Code Playgroud)
我如何使用这些代码,这些方法?它在我的实施文件中的位置?
靠近顶部的这条线表示您正在为NSMutableData添加AES功能:
@implementation NSMutableData(AES)
Run Code Online (Sandbox Code Playgroud)
在Objective-C中,这称为类别; 类别允许您扩展现有的类.
此代码通常位于名为NSMutableData-AES.m的文件中.创建一个头文件,NSMutableData-AES.h.它应该包含:
@interface NSMutableData(AES)
- (NSMutableData*) EncryptAES: (NSString *) key;
@end
Run Code Online (Sandbox Code Playgroud)
在主文件中包含(#import)该标头.在代码中添加对加密函数的调用:
NSData *InputData = [Input dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [InputData EncryptAES:@"myencryptionkey"];
Run Code Online (Sandbox Code Playgroud)
同样用于解密.
小智 6
因为到目前为止这似乎被忽略了:
CCCryptorStatus result = CCCrypt( kCCDecrypt , kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
**NULL**,
[self mutableBytes], [self length],
buffer_decrypt, bufferSize,
&numBytesEncrypted );
Run Code Online (Sandbox Code Playgroud)
从头文件CommonCrypto/CommonCryptor.h:
@param iv初始化向量,可选.启用密码块链接(CBC)模式时由块密码使用.如果存在,则必须与所选算法的块大小相同.如果选择了CBC模式(由于选项标志中没有kCCOptionECBMode位)并且不存在IV,则将使用NULL(全零)IV.如果使用ECB模式或选择了流密码算法,则忽略此参数.
粗体中的NULL对应于IV.遗憾的是,无论谁设计了API,都可以选择.这使得这种CBC模式基本上等同于ECB,由于各种原因不推荐使用ECB .