原文鏈接
源碼見文末
異或簡(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)行一次就是解密
- 假設(shè) 私鑰
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;
