心急的童鞋直接看這里EncryptDemo
DES么夫,3DES的ECB材失、CBC模式加解密方法All in here
DES在線驗(yàn)證
3DES在線驗(yàn)證
DES以64位分組長(zhǎng)度對(duì)數(shù)據(jù)加密官撼,其中包括了8位奇偶校驗(yàn)位读拆,所以實(shí)際的密文長(zhǎng)度為56位供汛,密鑰為64位8個(gè)字節(jié)
3DES是針對(duì)DES算法密鑰過(guò)短币呵、存在安全性的問(wèn)題而改進(jìn)的一個(gè)措施,被稱為“3DES”突那。密鑰長(zhǎng)度為24個(gè)字節(jié)挫酿,3DES在對(duì)明文進(jìn)行加密時(shí),采用了三次加密過(guò)程愕难,其中第一次和第三次是采用DES的加密算法早龟,第二次采用的則是解密算法,從而得到最終的密文猫缭。這種加密過(guò)程為“加密-解密-加密”葱弟,所以又稱為EDE(Encrypt-Decrypt-Encrypt)
加密模式
DES有四種加密模式(ECB、CBC猜丹、CFB芝加、OFB)
- 電碼本模式(Electronic Codebook Book (ECB)
- 密碼分組鏈接模式(Cipher Block Chaining (CBC))
- 密碼反饋模式(Cipher FeedBack (CFB))
- 輸出反饋模式(Output FeedBack (OFB))
跟AES一樣,在iOS用到的一般就是ECB和CBC兩種射窒。
ECB-電碼本模式
ECB是最簡(jiǎn)單的塊密碼加密模式藏杖,加密前根據(jù)加密塊大薪堋(DES密碼塊是64位即8個(gè)字節(jié))分成若干塊,之后將每塊使用相同的密鑰單獨(dú)加密蝌麸,所以加密塊相同的明文會(huì)生成相同的密文点寥。
CBC-密碼分組鏈接模式
CBC模式對(duì)于每個(gè)待加密的密碼塊在加密前會(huì)先與前一個(gè)密碼塊的密文異或然后再用加密器加密。第一個(gè)明文塊與一個(gè)叫初始化向量的數(shù)據(jù)塊異或来吩。
加解密函數(shù)詳解請(qǐng)看我的另一篇文章CCCrypt
需要引入 #import <CommonCrypto/CommonCrypto.h>
CCCrypt - 加解密函數(shù)
CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmAES128, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv, /* optional initialization vector */
const void *dataIn, /* optional per op and alg */
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
直接上代碼:以DES CBC模式加密為例敢辩,這里kDESIV是我直接定義好的偏移向量
+(NSData *)dataByDes:(NSData *)data key:(NSString *)key mode:(CCOperation)operation {
char keyPtr[kCCKeySizeDES + 1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = data.length;
size_t bufferSize = dataLength + kCCBlockSizeDES;
void * buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
NSString * initIv = kDESIV;
char ivPtr[kCCBlockSizeDES+1];
memset(ivPtr, 0x0, sizeof(ivPtr));
[initIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
CCCryptorStatus cryptStatus = CCCrypt(operation,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeDES,
ivPtr,
data.bytes,
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
NSData * result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
return result;
}
free(buffer);
return nil;
}