1.剛知道要做DES加密以為很簡單,網(wǎng)上代碼很多多矮,各種DES加密缓淹,大致都一樣。然而我們的后臺的安卓是用的一套DES加密算法塔逃,沒啥問題讯壶。可是到了我這邊湾盗,總是不一致伏蚊。
2.經(jīng)過多次測試發(fā)現(xiàn),是我這邊的DES加密模式和后臺對不上格粪。DES加密有兩種模式躏吊,ECB和CBC。還有就是填充模式帐萎,ios的填充模式只有兩種?kCCOptionPKCS7Padding ?和kCCOptionPKCS7Padding |?kCCOptionECBMode比伏。而后臺填充模式就多了。這就需要一一對應(yīng)才能實現(xiàn)加密和解密吓肋。
3.具體的對應(yīng)模式是java的DES/ECB/PKCS5Padding對應(yīng)ios的kCCOptionPKCS7Padding |?kCCOptionECBMode凳怨,DES/CBC/PKCS5Padding對應(yīng)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任選其一紫新,必須要和你的后臺對應(yīng)。(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ù)你們的后端要求。