Objective-C中的AES字符串加密

Sam*_*cer 11 encryption cryptography aes objective-c

我的Objective-C应用程序需要文本/字符串加密(特别是).

我知道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)

我如何使用这些代码,这些方法?它在我的实施文件中的位置?

Gra*_*rks 6

靠近顶部的这条线表示您正在为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 .