ios的DES加密遇到的坑

1.剛知道要做DES加密以為很簡單,網(wǎng)上代碼很多,各種DES加密,大致都一樣。然而我們的后臺的安卓是用的一套DES加密算法,沒啥問題。可是到了我這邊,總是不一致。

2.經(jīng)過多次測試發(fā)現(xiàn),是我這邊的DES加密模式和后臺對不上。DES加密有兩種模式,ECB和CBC。還有就是填充模式,ios的填充模式只有兩種?kCCOptionPKCS7Padding ?和kCCOptionPKCS7Padding |?kCCOptionECBMode。而后臺填充模式就多了。這就需要一一對應才能實現(xiàn)加密和解密。

3.具體的對應模式是java的DES/ECB/PKCS5Padding對應ios的kCCOptionPKCS7Padding |?kCCOptionECBMode,DES/CBC/PKCS5Padding對應ios的kCCOptionPKCS7Padding 。

4.具體的怎么加密呢,如下。


+(NSData*) encryptUseDES:(NSString*)plainText key:(NSString*)key

{ ? ?NSData*data;

? ? NSString*ciphertext =nil;

? ? NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

? ? NSUIntegerdataLength = [textDatalength];

? ? unsignedcharbuffer[1024];

? ? memset(buffer,0,sizeof(char));

? ? size_tnumBytesEncrypted =0;

? ? CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCCOptionPKCS7Padding ,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [keyUTF8String],kCCKeySizeDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iv,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [textDatabytes], dataLength,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer,1024,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &numBytesEncrypted);

? ? if(cryptStatus ==kCCSuccess) {

? ? ? ? data = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesEncrypted];

? ? }

? ? returndata;

}

?constByteiv[] = {1,2,3,4,5,6,7,8}; ??constByteiv[] = {0,1,2,3,4,5,6,7};

兩個iv任選其一,必須要和你的后臺對應。(CBC模式)


+(NSData*) encryptUseDES:(NSString*)plainText key:(NSString*)key

{ ? ?NSData*data;

? ? NSString*ciphertext =nil;

? ? NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

? ? NSUIntegerdataLength = [textDatalength];

? ? unsignedcharbuffer[1024];

? ? memset(buffer,0,sizeof(char));

? ? size_tnumBytesEncrypted =0;

? ? CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCCOptionPKCS7Padding |?kCCOptionECBMode,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [keyUTF8String],kCCKeySizeDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [textDatabytes], dataLength,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer,1024,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &numBytesEncrypted);

? ? if(cryptStatus ==kCCSuccess) {

? ? ? ? data = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesEncrypted];

? ? }

? ? returndata;

}

不需要初始化iv的加密。(ECB模式)


5.具體的解密如下:

+(NSString*)decryptUseDES:(NSData*)cipherdata key:(NSString*)key

{

? ? NSData*plaindata =nil;

?? ? NSString*plaintext =nil;

//? ? NSData *cipherdata = [GTMBase64 decodeString:cipherText];

? ? unsignedcharbuffer[1024];

? ? memset(buffer,0,sizeof(char));

? ? size_tnumBytesDecrypted =0;

? ? CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCCOptionPKCS7Padding ,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [keyUTF8String],kCCKeySizeDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? iv,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [cipherdatabytes], [cipherdatalength],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer,1024,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &numBytesDecrypted);

? ? if(cryptStatus ==kCCSuccess)

? ? {

? ? ? ? NSData*plaindata = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesDecrypted];

? ? ? ? plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];

? ? }

? ? returnplaintext;

}

需要iv的解密。


+(NSString*)decryptUseDES:(NSData*)cipherdata key:(NSString*)key

{

? ? NSData*plaindata =nil;

?? ? NSString*plaintext =nil;

//? ? NSData *cipherdata = [GTMBase64 decodeString:cipherText];

? ? unsignedcharbuffer[1024];

? ? memset(buffer,0,sizeof(char));

? ? size_tnumBytesDecrypted =0;

? ? CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCCOptionPKCS7Padding |?kCCOptionECBMode,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [keyUTF8String],kCCKeySizeDES,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [cipherdatabytes], [cipherdatalength],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer,1024,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &numBytesDecrypted);

? ? if(cryptStatus ==kCCSuccess)

? ? {

? ? ? ? NSData*plaindata = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesDecrypted];

? ? ? ? plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];

? ? }

? ? returnplaintext;

}

不需要iv的解密。



6.加密好的是Nsdata類型的,你們也可以轉(zhuǎn)編碼(BASE32和BASE64)都可以,根據(jù)你們的后端要求。

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

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

  • 引言 如今手機app五彩繽紛,確保手機用戶的數(shù)據(jù)安全是開發(fā)人員必須掌握的技巧,下面通過實例介紹DES在androi...
    freesan44閱讀 1,228評論 1 1
  • 小結(jié):其實網(wǎng)上大部分帖子已經(jīng)給出相應的代碼,但你會發(fā)現(xiàn)加密的結(jié)果不一致。有個關(guān)鍵點。 const char *te...
    narutocheen閱讀 1,633評論 2 1
  • 之前的項目中接觸過一些加密的方法,也沒有太仔細的進行記錄和研究。最近在寫SDK時,加密模塊的占比相當之大;借此時機...
    過半_e764閱讀 696評論 0 0
  • 追不到喜歡的人 可是人生還沒結(jié)束。
    Nacimei閱讀 253評論 0 3
  • 午夜時分,一片寂靜,內(nèi)心卻難以平復。 思緒萬千,繁雜凌亂,言語也不知所云。 時光荏苒,罅隙之間,一切將飛逝而去。 ...
    小九八閱讀 131評論 0 0

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