iOS AES256加密實(shí)現(xiàn)總結(jié):

項(xiàng)目中領(lǐng)導(dǎo)要求進(jìn)行數(shù)據(jù)加密豆胸, 要求如下:

注意:加密后的字節(jié)碼使用Base64轉(zhuǎn)換成字符串
加密模式: CBC
填充模式: PKCS7Padding
加密密鑰: 用戶密鑰的 SHA256 的32 bytes
AES IV : 加密密鑰的前 16 bytes

//
//  NSString+Encrypt.h
//  SwiftTemplet
//
//  Created by Bin Shang on 2020/8/29.
//  Copyright ? 2020 BN. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSString (Encrypt)

- (NSString *)SHA1;

- (NSString *)SHA256;

- (NSData *)SHA256Data;

///對(duì)明文加密
+(NSString *)encryptAESWithPlainText:(NSString *)plaintext;

///對(duì)密文解密
+(NSString *)decryptAESWithCipherText:(NSString *)ciphertexts;

    
@end

NS_ASSUME_NONNULL_END

//
//  NSString+Encrypt.m
//  SwiftTemplet
//
//  Created by Bin Shang on 2020/8/29.
//  Copyright ? 2020 BN. All rights reserved.
//

#import "NSString+Encrypt.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (Encrypt)

//
//  NSString+Encrypt.m
//  SwiftTemplet
//
//  Created by Bin Shang on 2020/8/29.
//  Copyright ? 2020 BN. All rights reserved.
//

#import "NSString+Encrypt.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (Encrypt)

- (NSString *)SHA1 {
    unsigned int outputLength = CC_SHA1_DIGEST_LENGTH;
    unsigned char output[outputLength];
    
    CC_SHA1(self.UTF8String, (unsigned int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], output);
    return [self toHexString:output length:outputLength];;
}

-(NSData *)SHA256Data{
    unsigned char hash[CC_SHA256_DIGEST_LENGTH];
    (void) CC_SHA256(self.UTF8String, (unsigned int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], hash);
    return ( [NSData dataWithBytes: hash length: CC_SHA256_DIGEST_LENGTH] );
}

- (NSString *)SHA256{
    unsigned int outputLength = CC_SHA256_DIGEST_LENGTH;
    unsigned char output[outputLength];
    
    CC_SHA256(self.UTF8String, (unsigned int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], output);
    return [self toHexString:output length:outputLength];;
}

- (NSString *)toHexString:(unsigned char*)data length:(unsigned int)length {
    NSMutableString *hash = [NSMutableString stringWithCapacity:length * 2];
    for (unsigned int i = 0; i < length; i++) {
        [hash appendFormat:@"%02x", data[i]];
        data[i] = 0;
    }
    return hash;
}

+(NSString *)encryptAESWithPlainText:(NSString *)plaintext{
    if (!plaintext) {
        return @"";
    }
    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
    NSString *sha1 = [bundleIdentifier SHA1];
    NSData *key = [sha1 SHA256Data];
    NSData * encryptData = [self AEC256EncryptWithPlainText:plaintext withKey:key];
    NSString *base64String = [encryptData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return base64String;
}

+(NSString *)decryptAESWithCipherText:(NSString *)ciphertexts{
    if (!ciphertexts) {
        return @"";
    }
    
    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
    NSString *sha1 = [bundleIdentifier SHA1];
    NSData *key = [sha1 SHA256Data];
    
    NSData *cipherData = [[NSData alloc]initWithBase64EncodedString:ciphertexts options:0];
    NSData *data = [self AES256DecryptWithCipherData:cipherData withKey:key];

    NSString *plainText = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    return plainText;
}
/*AES256加密方法*/
+(NSData *)AEC256EncryptWithPlainText:(NSString *)plainText withKey:(NSData *)key{
    if (plainText == nil) {
        return nil;
    }
    NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));

    NSUInteger dataLength = [plainData length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    bzero(buffer, sizeof(buffer));
    
    size_t numBytesEncrypted = 0;
    
    unsigned char *iv = malloc( 16 * sizeof(unsigned char) );
    [key getBytes:iv length:16];

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding,
                                          [key bytes],
                                          [key length],
                                          iv /* initialization vector (optional) */,
                                          [plainData bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);
    NSData *encryptData;
    if (cryptStatus == kCCSuccess) {
         encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
//     free the buffer;
//    free(buffer);
    free(iv);
    return encryptData;
}
/*AES256解密方法*/
+ (NSData *)AES256DecryptWithCipherData:(NSData *)cipherData withKey:(NSData *)key{
    if (!cipherData) {
        return nil;
    }
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
    NSUInteger dataLength = [cipherData length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    unsigned char *iv = malloc( 16 * sizeof(unsigned char) );
    [key getBytes:iv length:16];
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding,
                                          [key bytes],
                                          [key length],
                                          iv ,/* initialization vector (optional) */
                                          [cipherData bytes],
                                          dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);
    NSData *encryptData;
    if (cryptStatus == kCCSuccess) {
         encryptData= [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
//    free(buffer);
     //free the buffer;
    free(iv);
    return encryptData;
}


@end

????:
let encryptText = NSString.encryptAES(withPlainText: "AABBCC測(cè)試數(shù)據(jù)")
let decryptText = NSString.decryptAES(withCipherText: encryptText)
 DDLog(decryptText)

2020-08-29 15:05:03.387 FirstViewController.swift.viewWillAppear(_:)[line 93]: AABBCC測(cè)試數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末估盘,一起剝皮案震驚了整個(gè)濱河市骡尽,隨后出現(xiàn)的幾起案子遣妥,更是在濱河造成了極大的恐慌攀细,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班套,死亡現(xiàn)場(chǎng)離奇詭異故河,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鱼的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)痘煤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人衷快,你說(shuō)我怎么就攤上這事≌喊危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宝冕,是天一觀的道長(zhǎng)邓萨。 經(jīng)常有香客問(wèn)我地梨,道長(zhǎng),這世上最難降的妖魔是什么洁闰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任万细,我火速辦了婚禮,結(jié)果婚禮上雅镊,老公的妹妹穿的比我還像新娘。我一直安慰自己仁烹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布计呈。 她就那樣靜靜地躺著,像睡著了一般捌显。 火紅的嫁衣襯著肌膚如雪总寒。 梳的紋絲不亂的頭發(fā)上扶歪,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天摄闸,我揣著相機(jī)與錄音,去河邊找鬼炫欺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛品洛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桥状,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼硝清,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了耍缴?” 一聲冷哼從身側(cè)響起挽霉,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤变汪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后裙盾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庐完,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年徘熔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酷师。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖懂讯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褐望,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布譬挚,位于F島的核電站酪呻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玩荠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一阶冈、第九天 我趴在偏房一處隱蔽的房頂上張望塑径。 院中可真熱鬧,春花似錦统舀、人聲如沸劳景。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓮钥。三九已至,卻和暖如春碉熄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锈津。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留一姿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓艾栋,卻偏偏與公主長(zhǎng)得像蛉顽,于是被迫代替她去往敵國(guó)和親蝗砾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子携冤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353