如何使用目标C执行和比较iOS的AES加密/解密

问题描述

我正在使用AES加密/解密以及IV方法来为使用该应用程序的用户提供更高的安全性。为此,我设计了一个用于处理加密/解密过程的通用类。常见的类是:

Crypt.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>

NS_ASSUME_NONNULL_BEGIN

@interface Crypt : NSObject
+ (NSData *)aes128Data:(NSData *)dataIn
             operation:(Ccoperation)operation  // kCC Encrypt,Decrypt
                   key:(NSData *)key
               options:(Ccoptions)options      // kCcoption PKCS7Padding,ECBMode,iv:(NSData *)iv
                 error:(NSError **)error;
+ (NSData *)dataFromHexString:(Nsstring *)hexString;
@end

NS_ASSUME_NONNULL_END

Crypt.m

#import "Crypt.h"
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>

@implementation Crypt
+ (NSData *)aes128Data:(NSData *)dataIn
             operation:(Ccoperation)operation  // kCC Encrypt,iv:(NSData *)iv
                 error:(NSError **)error
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;
    NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

    ccStatus = CCCrypt( operation,kCCAlgorithmAES,options,key.bytes,key.length,iv.bytes,dataIn.bytes,dataIn.length,dataOut.mutableBytes,dataOut.length,&cryptBytes);

    if (ccStatus == kCCSuccess) {
        dataOut.length = cryptBytes;
    }
    else {
        if (error) {
            *error = [NSError errorWithDomain:@"kEncryptionError"
                                         code:ccStatus
                                     userInfo:nil];
        }
        dataOut = nil;
    }

    return dataOut;
}

+ (NSData *)dataFromHexString:(Nsstring *)hexString {
    char buf[3];
    buf[2] = '\0';
    unsigned char *bytes = malloc([hexString length]/2);
    unsigned char *bp = bytes;
    for (CFIndex i = 0; i < [hexString length]; i += 2) {
        buf[0] = [hexString characteratIndex:i];
        buf[1] = [hexString characteratIndex:i+1];
        char *b2 = NULL;
        *bp++ = strtol(buf,&b2,16);
    }

    return [NSData dataWithBytesNocopy:bytes length:[hexString length]/2 freeWhenDone:YES];
}

@end

为了在我的 view controller.m类中使用,我调用了如下所示的函数

- (IBAction)encryptAction:(id)sender {
    Nsstring *dataHexString = @"EA010B23CDA9B16F0001020304050607";
    Nsstring *keyHexString = @"000102030405060708090A0B0C0D0E0F";
    Nsstring *ivHexString = @"00102030405060708090A0B0C0D0E0F0";

    NSLog(@"dataHexString: %@",dataHexString);
    NSLog(@"keyHexString:  %@",keyHexString);
    NSLog(@"ivHexString:   %@",ivHexString);

    NSData *data = [Crypt dataFromHexString:dataHexString];
    NSData *key  = [Crypt dataFromHexString:keyHexString];
    NSData *iv   = [Crypt dataFromHexString:ivHexString];

    NSLog(@"data: %@",data);
    NSLog(@"key:  %@",key);
    NSLog(@"iv:   %@",iv);

    NSError *error;
    NSData *encryptedData = [Crypt
                             aes128Data:data
                             operation:kCCEncrypt
                             key:key
                             options:0
                             iv:iv
                             error:&error];

    NSLog(@"encryptedData %@",encryptedData);
}
- (IBAction)decryptAction:(id)sender {
    
    Nsstring *dataHexString = @"EA010B23CDA9B16F0001020304050607";
    Nsstring *keyHexString = @"000102030405060708090A0B0C0D0E0F";
    Nsstring *ivHexString = @"00102030405060708090A0B0C0D0E0F0";

    NSLog(@"dataHexString: %@",iv);

    NSError *error;
    NSData *encryptedData = [Crypt
                             aes128Data:data
                             operation:kCCDecrypt
                             key:key
                             options:0
                             iv:iv
                             error:&error];

    NSLog(@"DecryptedData %@",encryptedData);
   
}

当我运行加密和解密时,我得到的NSLOG值是:

encryptedData {length = 16,bytes = 0xb773c36749e87d3f8fed98fe52026a15}
DecryptedData {length = 16,bytes = 0xff4968ae8f53a8b5fa232bac9bc30890}

所以我如何比较解密后的数据与我们传递的数据相同,以及如何处理通过AES和IV方法传递用于加密的PlainText的代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)