"靜待花開:iOS密碼學(xué)算法解讀"

上一篇文章: "事半功倍:手機遠(yuǎn)程調(diào)試效率倍增"

密碼學(xué),作為一門研究數(shù)據(jù)加密和解密的學(xué)科框产,不僅僅是一種技術(shù),更是一種保護隱私和信息安全的重要手段赔硫。

它涉及到許多領(lǐng)域倒谷,包括算法、數(shù)學(xué)倔撞、計算機科學(xué)等等。

從最古老的凱撒密碼慕趴,到當(dāng)今復(fù)雜的RSA加密算法痪蝇,密碼學(xué)在保護我們的通信、交易和個人隱私方面發(fā)揮著關(guān)鍵作用冕房。

本文將探討密碼學(xué)的基本概念躏啰、主要應(yīng)用領(lǐng)域以及一些流行的加密算法。

通過對密碼學(xué)的介紹耙册,我們可以更好地理解數(shù)字世界中的隱私保護和信息安全問題给僵,從而更加安全地使用數(shù)字化技術(shù)。

密碼學(xué)

客戶端向服務(wù)器發(fā)送的數(shù)據(jù)包中详拙,一些參數(shù)的來源可能是隨機生成的想际、使用標(biāo)準(zhǔn)算法加密的,或者是經(jīng)過開發(fā)者自行設(shè)計的加密算法生成的溪厘。

在iOS中胡本,存在一系列現(xiàn)成的系統(tǒng)API供開發(fā)者調(diào)用。開發(fā)者必須使用固定的方法名來訪問這些API畸悬。因此侧甫,我們需要學(xué)習(xí)如何正確地利用這些API進行開發(fā)。

開發(fā)者也可以選擇自行實現(xiàn)算法蹋宦,或者使用他人編寫的模塊披粟。這些算法的運行不依賴于系統(tǒng)API,因此方法名可以被混淆冷冗。你需要做的是根據(jù)各種標(biāo)準(zhǔn)算法的特征守屉,去識別是否為標(biāo)準(zhǔn)算法。

常用的加密算法

消息摘要算法(散列函數(shù),哈希函數(shù))

MD5 SHA Hmac
對稱加密算法

DES 3DES AES
非對稱加密算法

RSA

在學(xué)習(xí)加密算法之前蒿辙,先了解一下編碼是很重要的拇泛。

  • Hex編碼 是一種編碼滨巴,而非加密

Hex編碼是一種將數(shù)據(jù)轉(zhuǎn)換為十六進制形式表示的編碼方式,每個字節(jié)被表示為兩個十六進制數(shù)字俺叭,常用于網(wǎng)絡(luò)通信恭取、數(shù)據(jù)存儲等領(lǐng)域。


    char* hexStr = "字符串";

    NSMutableString* resultStr = [NSMutableString string];

    for (int i = 0; i < strlen(hexStr); i++) {

        [resultStr appendFormat:@"%.2x", hexStr[i]];

    }

    NSLog(@"%@", resultStr);

  • Base64

Base64是一種將二進制數(shù)據(jù)轉(zhuǎn)換成文本字符串的編碼方式熄守,常用于網(wǎng)絡(luò)傳輸和數(shù)據(jù)存儲,而非加密算法蜈垮。


    char* hexStr = "字符串";

    NSData* data = [NSData dataWithBytes:hexStr length:strlen(hexStr)];

    NSString* result = [data base64EncodedStringWithOptions:0];

    NSLog(@"%@", result);

消息摘要算法

又稱單向散列函數(shù)或哈希函數(shù),是一種將輸入數(shù)據(jù)轉(zhuǎn)換為固定長度輸出的算法裕照。

一般應(yīng)用于校驗數(shù)據(jù)完整性,簽名sign

  • 算法特點
不同長度的輸入攒发,產(chǎn)生固定長度的輸出
散列后的密文不可逆
散列后的結(jié)果唯一
可能存在哈希碰撞,即不同的輸入可能會產(chǎn)生相同的輸出晋南。
  • 常見算法
MD5 SHA-1 SHA-256 SHA-512 HmacMD5 HmacSHA1 HmacSHA256 HmacSHA512等等
  • MD5加密

    const char* str = "字符串";

    unsigned char result[16];

    CC_MD5(str, (CC_LONG)strlen(str), result);

    NSMutableString* resultStr = [NSMutableString string];

    for (int i = 0; i < 16; i++) {

        [resultStr appendFormat:@"%.2x", result[i]];

    }

    NSLog(@"%@", resultStr);

  • SHA1加密

    const char* str = "字符串";

    unsigned char result[20];

    CC_SHA1(str, (CC_LONG)strlen(str), result);

    NSMutableString* resultStr = [NSMutableString string];

    for (int i = 0; i < 20; i++) {

        [resultStr appendFormat:@"%.2x", result[i]];

    }

    NSLog(@"%@", resultStr);

  • HMAC算法

HMAC算法與MD和SHA的主要區(qū)別在于引入了一個密鑰惠猿,這個密鑰可以是隨機生成的。


    const char* key = "key";

    const char* str = "字符串";

    unsigned char result[16];

    CCHmac(kCCHmacAlgMD5, key, strlen(key), str, strlen(str), result);

    NSMutableString* resultStr = [NSMutableString string];

    for (int i = 0; i < 16; i++) {

        [resultStr appendFormat:@"%.2x", result[i]];

    }

    NSLog(@"%@", resultStr);

對稱加密算法

如果加密和解密使用相同的密鑰搬俊,即對稱加密算法紊扬。

對稱加密算法的密鑰可以隨機生成蜒茄,但通常有一定的位數(shù)要求唉擂。對稱加密算法對輸入數(shù)據(jù)的長度沒有特定要求,且加密速度較快檀葛。

  • 對稱加密分類

RC4: 以字節(jié)流的方式,依次加密明文/解密密文的每一個字節(jié) 

DES,3DES,AES: 分組加密: 將明文消息分組,每組進行加密
  • 應(yīng)用模式

ECB

電子密碼本模式,每一塊數(shù)據(jù),獨立加密玩祟。

相同的明文塊會被加密成相同的密文塊,因此不適合加密重復(fù)性高的數(shù)據(jù)屿聋。

無初始向量空扎,容易受到密碼本重放攻擊,一般情況下很少用润讥。

CBC

密碼分組鏈接模式

每個數(shù)據(jù)塊的加密都依賴于前一個數(shù)據(jù)塊的密文转锈。

需要一個初始向量(IV)來增加獨一性,提高安全性楚殿。

密文的每個分組都與前一個密文分組相關(guān)聯(lián)撮慨,使得更難受到攻擊。

如果一個數(shù)據(jù)塊在傳遞是丟失或改變脆粥,后面的數(shù)據(jù)將無法正常解密砌溺。

ECB模式


    const char* key = "12345678";

    const char* plaintext = "";

    unsigned char result[32];

    size_t realLen = 0;

    CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionECBMode | kCCOptionPKCS7Padding, key, 8, NULL, plaintext, strlen(plaintext), result, 32, &realLen);

    NSMutableString* resultStr = [NSMutableString string];

    for (int i = 0; i < realLen; i++) {

        [resultStr appendFormat:@"%.2x", result[i]];

    }

    NSLog(@"%@", resultStr);

CBC模式

    const char* key = "";

    const char* iv  = "";

    const char* plaintext = "";

    unsigned char result[32];

    size_t realLen = 0;

    CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, key, 8, iv, plaintext, strlen(plaintext), result, 32, &realLen);

    NSMutableString* resultStr = [NSMutableString string];

    for (int i = 0; i < realLen; i++) {

        [resultStr appendFormat:@"%.2x", result[i]];

    }

    NSLog(@"%@", resultStr);

非對稱加密

  • RSA
需要生成一個密鑰對,其中包含公鑰和私鑰变隔。

公鑰用于加密數(shù)據(jù)规伐,私鑰用于解密;私鑰用于加密數(shù)據(jù)匣缘,公鑰用于解密猖闪。

通常情況下鲜棠,公鑰是公開的,私鑰需要保密萧朝。私鑰包含了公鑰岔留,但無法從公鑰推導(dǎo)出私鑰。

iOS提供了Security.framework來支持RSA算法的實現(xiàn)检柬。你可以使用SecKey類來生成RSA密鑰對献联、加密和解密數(shù)據(jù),以及進行數(shù)字簽名和驗證何址。這樣的功能可以在iOS應(yīng)用程序中實現(xiàn)安全的數(shù)據(jù)傳輸和存儲里逆。

總結(jié)

iOS密碼學(xué)涵蓋了多種加密算法和哈希算法,其中主要包括AES用爪、DES原押、3DES、RSA和哈希算法(如SHA-256等)偎血。

這些算法在iOS應(yīng)用中扮演著重要角色诸衔,用于數(shù)據(jù)加密、數(shù)字簽名和數(shù)據(jù)完整性驗證等方面颇玷。

對稱加密算法如AES笨农、DES和3DES適用于數(shù)據(jù)加密和解密,而非對稱加密算法RSA則用于密鑰交換和數(shù)字簽名帖渠。

同時谒亦,哈希算法被用于生成數(shù)據(jù)的摘要,用于驗證數(shù)據(jù)的完整性空郊。

iOS開發(fā)者可以根據(jù)應(yīng)用需求選擇適當(dāng)?shù)募用芩惴ê凸K惴▉肀Wo數(shù)據(jù)的安全性和完整性份招。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狞甚,隨后出現(xiàn)的幾起案子锁摔,更是在濱河造成了極大的恐慌,老刑警劉巖哼审,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谐腰,死亡現(xiàn)場離奇詭異,居然都是意外死亡棺蛛,警方通過查閱死者的電腦和手機怔蚌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旁赊,“玉大人桦踊,你說我怎么就攤上這事≈粘” “怎么了籍胯?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵竟闪,是天一觀的道長。 經(jīng)常有香客問我杖狼,道長炼蛤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任蝶涩,我火速辦了婚禮理朋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绿聘。我一直安慰自己嗽上,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布熄攘。 她就那樣靜靜地躺著兽愤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挪圾。 梳的紋絲不亂的頭發(fā)上浅萧,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音哲思,去河邊找鬼洼畅。 笑死,一個胖子當(dāng)著我的面吹牛也殖,可吹牛的內(nèi)容都是我干的土思。 我是一名探鬼主播务热,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼忆嗜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了崎岂?” 一聲冷哼從身側(cè)響起捆毫,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冲甘,沒想到半個月后绩卤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡江醇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年濒憋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陶夜。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡凛驮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出条辟,到底是詐尸還是另有隱情黔夭,我是刑警寧澤宏胯,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站本姥,受9級特大地震影響肩袍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婚惫,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一氛赐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧先舷,春花似錦鹰祸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尔破,卻和暖如春街图,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懒构。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工餐济, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胆剧。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓絮姆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秩霍。 傳聞我的和親對象是個殘疾皇子篙悯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345