倒腾了接近半天,资料找了无数,最后是通过查看Android项目中的加密工具类,才弄明白,在这过程中掌握了一些知识点。比如:

问题1:关于PKCS7Padding和PKCS5Padding

  iOS中AES加密算法采用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。在IOS中, kCCOptionPKCS7Padding ,其实单单这个参数就是告诉了函数运用CBC加密模式;kCCOptionPKCS7Padding|kCCOptionECBMode,就表示运用了ECB加密模式;在DES中加密数据包单位长度是8字节,在8字节的情况下PKCS7Padding 等价与 PKCS5Padding。

  PKCS7Padding跟PKCS5Padding的区别就在于数据填充方式,PKCS7Padding是缺几个字节就补几个字节的0,而PKCS5Padding是缺几个字节就补充几个字节的几,好比缺6个字节,就补充6个字节的6 。

问题2:关于Des和3DES

  Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding");

a.DESede加密算法的名称,如DESede实际上是3-DES。这一段还可以放其它的对称加密算法,如Blowfish等  

    b.CBC是分组加密的模式,除了CBC和ECB之外,还可以是NONE/CFB/QFB等。最常用的就是CBC和ECB了。DES采用分组加密的方式,将明文按8字节(64位)分组分别加密。如果每个组独立处理,则是ECB。CBC的处理方式是先用初始向量IV对第一组加密,再用第一组的密文作为密钥对第二组加密,然后依次完成整个加密操作。如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,但CBC则不会。

    c.最后一个分组的填充方式。大部分情况下,明文并非刚好64位的倍数。对于最后一个分组,如果长度小于64位,则需要用数据填充至64位。PKCS5Padding是常用的填充方式,如果没有指定,默认的方式就是它。

    ps:补充一点,虽然DES的有效密钥长度是56位,但要求密钥长度是64位(8字节)。3DES则要求24字节。

问题3:关于中文加密不正确

  通过代码1加密的密文与Android段加密的不一致(汉字),所以改段代码有些不正确,请用代码2

最后附上一段玩具代码1:

  1. NSString *cryptionKey = @"xxxxxxxxxxx";
  2. NSString *ciphertext = nil;
  3. const char *textBytes = [_pwdTextField.text UTF8String];
  4. NSUInteger dataLength = [_pwdTextField.text length];
  5. unsigned char buffer[];
  6. memset(buffer, , sizeof(char));
  7. const void *iv = (const void *)[aString UTF8String];
  8. size_t numBytesEncrypted = ;
  9. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES,
  10. kCCOptionPKCS7Padding,
  11. [cryptionKey UTF8String], kCCKeySize3DES,
  12. iv,
  13. textBytes, dataLength,
  14. buffer, ,
  15. &numBytesEncrypted);
  16. if (cryptStatus == kCCSuccess) {
  17. NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
  18. NSString *astring1 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  19. NSLog(@"dds:%@", astring1);
  20. ciphertext = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];
  21.  
  22. }

代码2:

  1. NSString *cryptionKey = @"xxxxxxxxxxxx";
  2. NSData *adata = [[NSData alloc] initWithBytes:ivKey length:];
  3. NSString *iV = [[NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding];
  4.  
  5. NSData* data = [_userNameTextField.text dataUsingEncoding:NSUTF8StringEncoding];
  6. size_t plainTextBufferSize = [data length];
  7. const void *vplainText = (const void *)[data bytes];
  8.  
  9. CCCryptorStatus ccStatus;
  10. uint8_t *bufferPtr = NULL;
  11. size_t bufferPtrSize = ;
  12. size_t movedBytes = ;
  13.  
  14. bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - );
  15. bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
  16. memset((void *)bufferPtr, 0x0, bufferPtrSize);
  17.  
  18. const void *vkey = (const void *) [cryptionKey UTF8String];
  19. const void *vinitVec = (const void *) [iV UTF8String];
  20.  
  21. ccStatus = CCCrypt(kCCEncrypt,
  22. kCCAlgorithm3DES,
  23. kCCOptionPKCS7Padding,
  24. vkey,
  25. kCCKeySize3DES,
  26. vinitVec,
  27. vplainText,
  28. plainTextBufferSize,
  29. (void *)bufferPtr,
  30. bufferPtrSize,
  31. &movedBytes);
  32.  
  33. NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
  34. NSString *result = [GTMBase64 stringByEncodingData:myData];

资料链接:

  http://blog.csdn.net/u010184533/article/details/38975871

http://www.cocoachina.com/bbs/read.php?tid-273195-page-3.html

  http://www.cnblogs.com/qkhh/p/4683626.html

   http://www.programering.com/a/MzN1cjNwATQ.html

其他资料:

  http://www.jianshu.com/p/98610bdc9bd6

  https://my.oschina.net/tinglanrmb32/blog/351021

关于CBC for ios 加密要记的更多相关文章

  1. iOS AES128 CBC No Padding加密解密

    最近的项目中数据传输用到加密,项目选择了AES128 CBC No Padding加密方式,PHP和Android方面的代码网上太多了.但是唯独没有iOS的,但是也有别的写法,但不是是AES128 C ...

  2. 非对称加密, 助记词, PIN, WIF

    一钱包 1.1非对称加密, 助记词, PIN, WIF, 地址 1.1.1 非对称加密算法 非对称加密算法, 加密与解密使用不同的KEY, 我们分别称为私钥与公钥,其中可以通过私钥生成公钥 在比特币中 ...

  3. AES/CBC/PKCS5Padding对称加密

    package unit; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.cry ...

  4. iOS - Safe iOS 加密安全

    1.Base64 编码 简介: Base64 是一种基于64个可打印字符来表示二进制数据的表示方法,可打印字符包括字母 A-Z.a-z.0-9,共 62 个字符,另外两个符号在不同的系统不同 +,/. ...

  5. iOS加密之AES

    心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...

  6. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  7. 关于 iOS 加密的一些详谈

    iOS 加密算法有那么几种,如 md5,sha1,AES,base64 和 rsa 等. 1. md5: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息 ...

  8. C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

    之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...

  9. ios 加密解密工具类字符判断等

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface Helpers : NSObject ...

随机推荐

  1. Asp.Net Mvc3.0(MEF依赖注入理论)

    前言 Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)等.MEF为开发人员提供了一个工具,让我们 ...

  2. NumPy-高速处理数据

    Numpy简单介绍 标准安装的Python中用列表(list)保存一组值,能够用来当作数组使用,只是因为列表的元素能够是不论什么对象,因此列表中所保存的是对象的指针.这样为了保存一个简单的[1,2,3 ...

  3. Android scrollbar的设置

    insideOverlay:默认值,表示在padding区域内并且覆盖在view上 insideInset:表示在padding区域内并且插入在view后面 outsideOverlay:表示在pad ...

  4. .NetCore中EFCore for MySql整理

    一.MySql官方提供了Ef Core对MySql的支持,但现在还处于预览版 Install-Package MySql.Data.EntityFrameworkCore -Pre Install-P ...

  5. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十二)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网。

    Centos7出现异常:Failed to start LSB: Bring up/down networking. 按照<Kafka:ZK+Kafka+Spark Streaming集群环境搭 ...

  6. O2O、C2C、B2B、B2C

    一.O2O.C2C.B2B.B2C的区别在哪里? O2O是Online to offline 分为四种运营模式 1.Online to offline 是线上交易到线下消费体验 2.Offline t ...

  7. 在linux 中wget 无法解析主机

    vim /etc/resolv.cof 在里面加入节点 nameserver 8.8.8.8 / nameserver 8.8.4.4 即可 失败时: 成功时:

  8. 也谈OpenStack中的虚拟机HA

    OpenStack是一个旨在为公共及私有云的建设与管理提供软件的开源项目. 它的社区拥有超过130家企业及1350位开发人员,这些机构与个人都将OpenStack作为基础设施即服务(IaaS)资源的通 ...

  9. DELL平板如何安装WIN10系统-磁盘分区问题

    已经进入PE之后,在这一步的时候,可以把默认的系统分区都移除,但是在计算机管理可能右击没有这个菜单,要用专门的软件弄   不要用分区助手,会提示不能对动态磁盘进行操作,要用Disk Genius(他的 ...

  10. Provide your license server administrator with the following information.error code =-42,147

    ArcEngine应用程序开发中,许可不必不可少的.一般采取两种方式来获取许可——License控件和AoInitialize类,但今天在VS2010打开程序时,隔一会弹出错误窗口:Provide y ...