本文主要說(shuō)AES加密,而DES大同小異奖磁,揭秘也是一個(gè)屬性的問(wèn)題
首先改基,網(wǎng)絡(luò)上關(guān)于iOSAES加密的資料與方法有很多,并且也都可以運(yùn)行咖为,但是大部分作者都是就自己項(xiàng)目寫的代碼秕狰,具體參數(shù)和可能出現(xiàn)坑的地方都沒(méi)有說(shuō)明白,也就是說(shuō)躁染,那些代碼可能沒(méi)有錯(cuò)鸣哀,但就是不適用于你自己的項(xiàng)目。
特別說(shuō)明:1. 本文是自己項(xiàng)目中用到后用來(lái)記錄之用褐啡,也為了興許能幫助到的同胞诺舔。如果有說(shuō)的不對(duì)的地方,感謝指正;2. 以下代碼是自己學(xué)習(xí)過(guò)程中低飒,通過(guò)網(wǎng)絡(luò)上不同大神們的代碼結(jié)合所成许昨;3. 以下言論需要斟酌后使用,出錯(cuò)不負(fù)責(zé)褥赊,幫你解決問(wèn)題也不收禮
先上代碼
/**
* 加密
*
* @param plainText 明文
* @param key 密鑰
* @param iv 向量
*
* @return 密文
*/
+ (NSString *)AES256Encrypt:(NSString *)plainText key:(NSString *)key iv:(NSString *)iv {
char keyPtr[kCCKeySizeAES256+1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
size_t bufferSize = [data length] + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
[key length],
ivPtr,
[data bytes],
[data length],
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
return [resultData base64EncodedStringWithOptions:0];
}
free(buffer);
return nil;
}
需要注意的地方有幾個(gè):
- CCCrypt 第一個(gè)參數(shù):kCCEncrypt:加密 糕档;kCCDecrypt:解密
- CCCrypt 第二個(gè)參數(shù):區(qū)分AES加密與DES加密
- key(密鑰)的長(zhǎng)度,
char keyPtr[kCCKeySizeAES256+1];
需要注意此處后臺(tái)給你的key的長(zhǎng)度,AES的key長(zhǎng)度kCCKeySizeAES128 = 16, kCCKeySizeAES192 = 24, kCCKeySizeAES256 = 32,
- 向量的長(zhǎng)度,
char ivPtr[kCCBlockSizeAES128 + 1];
一般就是16位拌喉,我自己認(rèn)為沒(méi)有再多的了 - 最后一個(gè)非常要注意的點(diǎn):iOS中填充模式?jīng)]有[kCCOptionPKCS5Padding][1]模式速那,而如果后臺(tái)跟安卓又都是kCCOptionPKCS5Padding的話,那iOS就可以在CCCrypt參數(shù)中用kCCOptionPKCS7Padding | kCCOptionECBMode(不寫的話默認(rèn)為CBC模式)來(lái)代替尿背。以下純屬個(gè)人猜想??為什么加了這個(gè)東西端仰,結(jié)果出來(lái)就跟kCCOptionPKCS5Padding的一樣:因?yàn)镮V向量默認(rèn)是16個(gè)0,而kCCOptionPKCS7Padding的填充模式又是不足補(bǔ)0田藐,但是ECB加密模式是不需要向量的荔烧,所以在kCCOptionPKCS7Padding的基礎(chǔ)上加了kCCOptionECBMode就跟kCCOptionPKCS5Padding的是缺幾個(gè)字節(jié)就補(bǔ)充幾個(gè)字節(jié)的幾模式結(jié)果一樣了??
- 如果不寫kCCOptionECBMode,使用了默認(rèn)的CBC模式汽久,并且沒(méi)有固定向量IV的話鹤竭,每次的加密結(jié)果都會(huì)是不一樣的,因?yàn)榫按迹珻BC時(shí)需要向量的臀稚,所以每次會(huì)生成一個(gè)隨機(jī)的向量,所以每次加密結(jié)果都不一樣三痰。
- 在出現(xiàn)錯(cuò)誤時(shí)從以下幾個(gè)方面進(jìn)行檢查
- key與IV長(zhǎng)度問(wèn)題
- 填充模式問(wèn)題kCCOptionPKCS5Padding吧寺,kCCOptionPKCS7Padding
- 很多時(shí)候,后臺(tái)的同事也不明白AES加密的具體情況酒觅,他們可能也只是從網(wǎng)絡(luò)上找了一些方法來(lái)加密撮执,所以微峰,不用太指望別人跟你說(shuō)他們模式等東西舷丹。最好的辦法就是,給后臺(tái)一個(gè)明文蜓肆,讓他們用他們的模式生成一個(gè)秘文颜凯,然后確定好KEY與IV之后,在自己的程序中修改參數(shù)最終確定是那種模式(當(dāng)然仗扬,如果后臺(tái)給你症概,把AES加密的各種模式都跟你說(shuō)了,最好)
阿里云服務(wù)器免費(fèi)領(lǐng)了,企業(yè)新用戶:4核-8G-5M,個(gè)人用戶:2核-4G-1M
點(diǎn)擊立即領(lǐng)取
免費(fèi)阿里云服務(wù)器立即領(lǐng)取
-
PKCS7Padding跟PKCS5Padding的區(qū)別就在于數(shù)據(jù)填充方式早芭,PKCS7Padding是缺幾個(gè)字節(jié)就補(bǔ)幾個(gè)字節(jié)的0彼城,而PKCS5Padding是缺幾個(gè)字節(jié)就補(bǔ)充幾個(gè)字節(jié)的幾,好比缺6個(gè)字節(jié),就補(bǔ)充6個(gè)字節(jié)的6 ?