IOS开发DES、AES加密遇到的坑

加密模式做个简单的介绍

  • 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

代码示例

  • DES加密ECB模式,加密。

+(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;
}
  • DES加密CBC模式

+(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加密、解密略。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SY.ZHOU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值