加密模式做个简单的介绍
- DES、AES加密常用的加密模式有两种ECB和CBC,他们之间的区别就是ECB没有初始化向量而CBC有,CBC模式也更加安全。
- 初始化向量的作用是用于明文用初始化向量混合加密。如果只有一个秘钥进行加密的话,明文中相同的文字会加密成相同的密文,这样明文跟密文就有相同的结构,导致容易破解。初始化向量加密方式——初始化向量与第一个明文混合加密,第二个明文与第一个明文与初始向量混合加密后的密文混合加密… …以此类推,保证加密出来的密文与明文之间的结构完全不同,更加安全。
三种填充模式的区别(PKCS7Padding/PKCS5Padding/ZeroPadding)
- DES、AES加密算法中要求明文按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于任意一段数据,加密前需要对最后一个块填充到16字节,解密后需要删除掉填充的数据。
- ZeroPadding:数据长度不足时 用0填充,佛则不填充。
- PKCS7Padding:数据长度不足时用n填充,n为需要填充的字节数。比如数据需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n。另外,如果数据本身已经对齐,则填充一个长度为块大小的数据,每个字节都是块大小。
- PKCS5Padding:为PKCS7Padding的子集,块大小固定为8个字节。
- IOS开发需要特别注意的是IOS没有ZeroPadding填充模式。IOS只有两种填充模式 kCCOptionPKCS7Padding 和kCCOptionPKCS7Padding | kCCOptionECBMode。而后台填充模式很多。这就需要一一对应才能实现加密和解密。
- 具体的对应方式是:IOS的kCCOptionPKCS7Padding对应Java的DES/CBC/PKCS5Padding,kCCOptionPKCS7Padding | kCCOptionECBMode对应Java的DES/ECB/PKCS5Padding
代码示例
+(NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key
{
NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [textData length];
unsigned char buffer[1024];
bzero(buffer, sizeof(char));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
NULL, // 初始化向量
[textData bytes],
dataLength,
buffer,
1024,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
if (data && data.length > 0)
{
Byte *datas = (Byte*)[data bytes];
NSMutableString *output = [NSMutableString stringWithCapacity:data.length * 2];
for(int i = 0; i < data.length; i++)
{
[output appendFormat:@"%x", datas[i]];
}
NSString *ciphertext = output;
return [ciphertext uppercaseString];//字符变大写;
}
}
free(buffer);
return nil;
}
+(NSString *)encryptUseDES2:(NSString *)plainText key:(NSString *)key
{
NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [textData length];
unsigned char buffer[1024];
bzero(buffer, sizeof(char));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[key UTF8String],
kCCKeySizeDES,
IV, // 初始化向量
[textData bytes],
dataLength,
buffer,
1024,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
if (data && data.length > 0)
{
Byte *datas = (Byte*)[data bytes];
NSMutableString *output = [NSMutableString stringWithCapacity:data.length * 2];
for(int i = 0; i < data.length; i++)
{
[output appendFormat:@"%x", datas[i]];
}
NSString *ciphertext = output;
return [ciphertext uppercaseString];//字符变大写;
}
}
free(buffer);
return nil;
}
- 注IV需要与后台对应,例如 constByteIV[] = {1,2,3,4,5,6,7,8};
- DES解密,略。
- AES加密、解密略。