心急的童鞋直接看这里EncryptDemo
DES,3DES的ECB、CBC模式加解密方法All in here
DES在线验证
3DES在线验证
DES以64位分组长度对数据加密,其中包括了8位奇偶校验位,所以实际的密文长度为56位,密钥为64位8个字节
3DES是针对DES算法密钥过短、存在安全性的问题而改进的一个措施,被称为“3DES”。密钥长度为24个字节,3DES在对明文进行加密时,采用了三次加密过程,其中第一次和第三次是采用DES的加密算法,第二次采用的则是解密算法,从而得到最终的密文。这种加密过程为“加密-解密-加密”,所以又称为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是最简单的块密码加密模式,加密前根据加密块大小(DES密码块是64位即8个字节)分成若干块,之后将每块使用相同的密钥单独加密,所以加密块相同的明文会生成相同的密文。
CBC-密码分组链接模式
CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。
加解密函数详解请看我的另一篇文章CCCrypt
需要引入 #import
CCCrypt - 加解密函数
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;
}