iOS 異或加密(XOR)

原文鏈接
源碼見文末

異或簡(jiǎn)介

  • 異或,二元運(yùn)算;
  • 符號(hào)^;
  • 口訣:相同為0,不相同為1;
  • 舉例
    • 10011101^10001010=00010111

應(yīng)用場(chǎng)景

  • 密碼加密(此場(chǎng)景在日常開發(fā)中使用較多,本文將著重介紹此應(yīng)用場(chǎng)景)
  • 數(shù)據(jù)暫存
  • 嵌入式

異或加密原理

  • 假設(shè)明文A, 密鑰B, 密文C,
  • 通過(guò)異或加密過(guò)程為A ^ B = C, 得到密文C
  • 如果此時(shí)知道密文A和密鑰B,那么通過(guò)異或解密過(guò)程為C ^ B = A, 重新得到明文A
  • 異或加密

異或加密應(yīng)用

  • 企業(yè)由于數(shù)據(jù)具有保密性,需要對(duì)敏感數(shù)據(jù)進(jìn)行加密。 數(shù)據(jù)存在的形式可能是客戶端的緩存、內(nèi)置資源文件、網(wǎng)絡(luò)傳輸?shù)?,這些數(shù)據(jù)都有可能被用戶,競(jìng)爭(zhēng)對(duì)手,黑客截獲的潛在風(fēng)險(xiǎn);通過(guò)加密可以進(jìn)行規(guī)避,異或加密是其中較為簡(jiǎn)單的一種實(shí)現(xiàn)方案。
  • 例如某公司App要內(nèi)置一些核心資源配置文件,為防止用戶窺探,采用了加密處理,先將方案分享如下:
    • 后端生成配置文件時(shí),用私鑰對(duì)數(shù)據(jù)進(jìn)行異或運(yùn)算處理,生成密文;客戶端拿到密文,通過(guò)自動(dòng)或手動(dòng)打包的app中,app在運(yùn)行時(shí),采用相同的密鑰、按照相同的算法進(jìn)行異或運(yùn)算,得到明文,進(jìn)而使用。
    • 異或算法
      • 假設(shè) 私鑰abcdefg7位,將數(shù)據(jù)轉(zhuǎn)換為data類型,獲取所有字節(jié);將字節(jié)每七位分別于私鑰七位字符異或運(yùn)算,一直循環(huán)到最后得到密文
      • 異或解密算法和加密算法一致,即通過(guò)這個(gè)算法運(yùn)行一次是加密,再通過(guò)這個(gè)算法運(yùn)行一次就是解密

iOS代碼實(shí)現(xiàn)

// 客戶端內(nèi)置私鑰
static NSString const *privateKey = @"ef37c9111210854f5986fc9ebb5548b2ae";

@implementation NSData(XOREncrypt)
- (NSData *)xor_decrypt
{
    return [self xor_encrypt];
}

// 加密
- (NSData *)xor_encrypt
{
    // 獲取key的長(zhǎng)度
    NSInteger length = privateKey.length;

    // 將OC字符串轉(zhuǎn)換為C字符串
    const char *keys = [privateKey cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cKey[length];

    memcpy(cKey, keys, length);

    // 數(shù)據(jù)初始化,空間未分配 配合使用 appendBytes
    NSMutableData *encryptData = [[NSMutableData alloc] initWithCapacity:length];

    // 獲取字節(jié)指針
    const Byte *point = self.bytes;

    for (int i = 0; i < self.length; i++) {
        int l = i % length;                     // 算出當(dāng)前位置字節(jié),要和密鑰的異或運(yùn)算的密鑰字節(jié)
        char c = cKey[l];
        Byte b = (Byte) ((point[i]) ^ c);       // 異或運(yùn)算
        [encryptData appendBytes:&b length:1];  // 追加字節(jié)
    }
    return encryptData.copy;
}
@end

思考題

int a = 15;
int b = 20;

不用第三個(gè)變量,交換兩個(gè)變量的值?

  • 答案(面試裝13用)
int a = 15;
int b = 20;

a = a ^ b;
b = a ^ b;
a = a ^ b;


源碼

XORDemo源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容