iOS--對稱加密的演示,終端和代碼分別演示悄泥,AES虏冻,DES

終端演示

OpenSSL

以DES為例,列舉

DES-ecb加密“message.txt”

message.txt內(nèi)容如下:

helloworld
helloworld
helloworld
helloworld
helloworld
helloworld
$ openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg.bin

-enc 代表對稱加密算法
-aes 表示算法弹囚;
-ecb 表示模式
-K 616263 表示密鑰, 等同于小寫的“abc”,為什么等于abc厨相,ASCII碼
-nosalt 不加鹽
-out 輸出
-msg.bin 輸出的文件名字

DES加密“message1.txt”

message.txt內(nèi)容如下:

helloworld
helloworld
helloworld
helloworle
helloworld
helloworld
$ openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg1.bin

利用命令xxd可以查看

$ xxd msg1.bin
圖2

觀察圖2,我們可以看到加密之后有哪些不同的地方鸥鹉。

DES-cbc加密“message.txt”

message.txt 蛮穿,message1.txt 內(nèi)容不變

message.txt生成msg3.bin:
$ openssl enc -des-cbc -iv 123456789  -K 616263 -nosalt -in message.txt -out msg3.bin

和ecb相比,多了一個(gè)參數(shù)iv
-iv 12345678 表示一個(gè)向量
現(xiàn)代密碼學(xué)里面毁渗,都會和幾何有關(guān)践磅,幾何里面的變化,都是有規(guī)律灸异,結(jié)果又是多變的府适。

message1.txt生成msg4.bin:
$ openssl enc -des-cbc -iv 123456789  -K 616263 -nosalt -in message1.txt -out msg4.bin
圖3

觀察圖3,我們可以看到改變的數(shù)據(jù)之后绎狭,全部發(fā)生了變化细溅。
這就是cbc,所有的加密都依賴于前面數(shù)據(jù),一個(gè)地方改變儡嘶,后續(xù)的所有數(shù)據(jù)都變了。

代碼演示

(注:蘋果給我們提供的對稱加密算法有很多恍风,在此僅以AES蹦狂,DES為例)

蘋果官方給出的枚舉
enum {
    /* AES */
    kCCBlockSizeAES128        = 16,
    /* DES */
    kCCBlockSizeDES           = 8,
    /* 3DES */
    kCCBlockSize3DES          = 8,
    /* CAST */
    kCCBlockSizeCAST          = 8,
    kCCBlockSizeRC2           = 8,
    kCCBlockSizeBlowfish      = 8,
};

EncryptionTools.h文件:

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

/**
 *  終端測試指令
 *
 *  DES(ECB)加密
 *  $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64
 *
 * DES(CBC)加密
 *  $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *  AES(ECB)加密
 *  $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
 *
 *  AES(CBC)加密
 *  $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *  DES(ECB)解密
 *  $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
 *
 *  DES(CBC)解密
 *  $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *  AES(ECB)解密
 *  $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
 *
 *  AES(CBC)解密
 *  $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *  提示:
 *      1> 加密過程是先加密,再base64編碼
 *      2> 解密過程是先base64解碼朋贬,再解密
 */
@interface EncryptionTools : NSObject
    
+ (instancetype)sharedEncryptionTools;
    
    /**
     @constant   kCCAlgorithmAES     高級加密標(biāo)準(zhǔn)凯楔,128位(默認(rèn))
     @constant   kCCAlgorithmDES     數(shù)據(jù)加密標(biāo)準(zhǔn)
     */
    @property (nonatomic, assign) uint32_t algorithm;
    
    /**
     *  加密字符串并返回base64編碼字符串
     *
     *  @param string    要加密的字符串
     *  @param keyString 加密密鑰
     *  @param iv        初始化向量(8個(gè)字節(jié))
     *
     *  @return 返回加密后的base64編碼字符串
     */
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
    /**
     *  解密字符串
     *
     *  @param string    加密并base64編碼后的字符串
     *  @param keyString 解密密鑰
     *  @param iv        初始化向量(8個(gè)字節(jié))
     *
     *  @return 返回解密后的字符串
     */
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
@end

EncryptionTools.m文件:

#import "EncryptionTools.h"

@interface EncryptionTools()
    @property (nonatomic, assign) int keySize;
    @property (nonatomic, assign) int blockSize;
    @end

@implementation EncryptionTools
    
+ (instancetype)sharedEncryptionTools {
    static EncryptionTools *instance;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
        instance.algorithm = kCCAlgorithmAES;
    });
    
    return instance;
}
    
- (void)setAlgorithm:(uint32_t)algorithm {
    _algorithm = algorithm;
    switch (algorithm) {
        case kCCAlgorithmAES:
        self.keySize = kCCKeySizeAES128;
        self.blockSize = kCCBlockSizeAES128;
        break;
        case kCCAlgorithmDES:
        self.keySize = kCCKeySizeDES;
        self.blockSize = kCCBlockSizeDES;
        break;
        default:
        break;
    }
}
    
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv {
    
    // 設(shè)置秘鑰
    NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t cKey[self.keySize];
    bzero(cKey, sizeof(cKey));
    [keyData getBytes:cKey length:self.keySize];
    
    // 設(shè)置iv
    uint8_t cIv[self.blockSize];
    bzero(cIv, self.blockSize);
    int option = 0;
    if (iv) {
        [iv getBytes:cIv length:self.blockSize];
        option = kCCOptionPKCS7Padding;
    } else {
        option = kCCOptionPKCS7Padding | kCCOptionECBMode;
    }
    
    // 設(shè)置輸出緩沖區(qū)
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    size_t bufferSize = [data length] + self.blockSize;
    void *buffer = malloc(bufferSize);
    
    // 開始加密
    size_t encryptedSize = 0;
    //加密解密都是它 -- CCCrypt
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          self.algorithm,
                                          option,
                                          cKey,
                                          self.keySize,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);
    
    NSData *result = nil;
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
    } else {
        free(buffer);
        NSLog(@"[錯誤] 加密失敗|狀態(tài)編碼: %d", cryptStatus);
    }
    
    return [result base64EncodedStringWithOptions:0];
}
    
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv {
    
    // 設(shè)置秘鑰
    NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t cKey[self.keySize];
    bzero(cKey, sizeof(cKey));
    [keyData getBytes:cKey length:self.keySize];
    
    // 設(shè)置iv
    uint8_t cIv[self.blockSize];
    bzero(cIv, self.blockSize);
    int option = 0;
    if (iv) {
        [iv getBytes:cIv length:self.blockSize];
        option = kCCOptionPKCS7Padding;
    } else {
        option = kCCOptionPKCS7Padding | kCCOptionECBMode;
    }
    
    // 設(shè)置輸出緩沖區(qū)
    NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
    size_t bufferSize = [data length] + self.blockSize;
    void *buffer = malloc(bufferSize);
    
    // 開始解密
    size_t decryptedSize = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          self.algorithm,
                                          option,
                                          cKey,
                                          self.keySize,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &decryptedSize);
    
    NSData *result = nil;
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
    } else {
        free(buffer);
        NSLog(@"[錯誤] 解密失敗|狀態(tài)編碼: %d", cryptStatus);
    }
    
    return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
}
    
    @end

演示例子:

/**
     AES-ECB
     */
    NSString *key = @"abc";//終端演示的時(shí)候,616263
    NSString *encStrA = [[EncryptionTools sharedEncryptionTools]encryptString:@"hello" keyString:key iv:nil];//ECB沒有向量锦募,所以iv傳nil
    NSLog(@"AES-ECB加密的結(jié)果:%@",encStrA);
    NSLog(@"AES-ECB解密的結(jié)果:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStrA keyString:key iv:nil]);
    /**
     AES-CBC
     */
    uint8_t iv[8] = {1,2,3,4,5,6,7,8};
    NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
     NSString *encStrB = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:@"abc" iv:ivData];
     NSLog(@"AES-CBC加密的結(jié)果:%@",encStrB);
    NSLog(@"AES-CBC解密的結(jié)果:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStrB keyString:@"abc" iv:ivData]);
    

重點(diǎn)摆屯!

最最重要的一點(diǎn),其中最重要的函數(shù)就是CCCrypt函數(shù):
iOS--CCCrypt函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糠亩,一起剝皮案震驚了整個(gè)濱河市虐骑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赎线,老刑警劉巖廷没,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垂寥,居然都是意外死亡颠黎,警方通過查閱死者的電腦和手機(jī)另锋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狭归,“玉大人夭坪,你說我怎么就攤上這事」担” “怎么了室梅?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長潭流。 經(jīng)常有香客問我竞惋,道長,這世上最難降的妖魔是什么灰嫉? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任拆宛,我火速辦了婚禮,結(jié)果婚禮上讼撒,老公的妹妹穿的比我還像新娘浑厚。我一直安慰自己,他們只是感情好根盒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布钳幅。 她就那樣靜靜地躺著,像睡著了一般炎滞。 火紅的嫁衣襯著肌膚如雪敢艰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天册赛,我揣著相機(jī)與錄音钠导,去河邊找鬼。 笑死森瘪,一個(gè)胖子當(dāng)著我的面吹牛牡属,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扼睬,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逮栅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窗宇?” 一聲冷哼從身側(cè)響起措伐,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担映,沒想到半個(gè)月后废士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝇完,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年官硝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矗蕊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氢架,死狀恐怖傻咖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岖研,我是刑警寧澤卿操,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站孙援,受9級特大地震影響害淤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拓售,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一窥摄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧础淤,春花似錦崭放、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玻侥,卻和暖如春决摧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凑兰。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工蜜徽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人票摇。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像砚蓬,于是被迫代替她去往敵國和親矢门。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容