iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败
今天做项目,需要进行3des加密。 加密的gkey:abcdefgh giv:(偏移量)abcdefgh
加密后结果:p+X985x5bFS6dWjAnm6sdQ==
下面是代码:
+(NSString *)DES3StringFromText:(NSString *)text{
const void *vplainText;
size_t plainTextBufferSize;
NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];
plainTextBufferSize = [data length];
vplainText = (const void *)[data bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = ;
size_t movedBytes = ;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - );
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
const void *vkey = (const void *) [[NSString stringWithFormat:@"%@%@%@",gkey,gkey,gkey] UTF8String];
const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
vkey, //key 此处key的长度 和下面参数指定的长度要相同
kCCKeySize3DES, //key的长度为24位,所以 vkey必须是24位长度
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [GTMBase64 stringByEncodingData:myData];
return result;
}
可以看到我代码中标红的地方:
const void *vkey = (const void *) [[NSString stringWithFormat:@"%@%@%@",gkey,gkey,gkey] UTF8String]; 为什么key要重复三遍???很重要! 因为你下面 指定的参数
kCCKeySize3DES 值是24
kCCKeySize3DES = 24,
我们看一下这个参数的解释:
keyLength |
Length of key material. Must be appropriate for the select algorithm. Some algorithms may provide for varying key lengths. |
|---|
反正大概的意思就是 关键字的长度。必须选择合适算法,每一种算法的关键字长度可能不一样 所以,我们选择了 kCCAlgorithm3DES 这个算法,这个算法的长度是24,你的关键字也必须是24位!! 这也就是为什么 上面我们要把关键字重复三遍的原因。
所以,我们举一反三,如果使用DES加密,我们的算法选择是 kCCAlgorithmDES, 秘钥必须是对应的 kCCKeySizeDES ,你的关键字长度必须是8位!
代码:
+(NSString *)DES3StringFromText:(NSString *)text{
const void *vplainText;
size_t plainTextBufferSize;
NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];
plainTextBufferSize = [data length];
vplainText = (const void *)[data bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = ;
size_t movedBytes = ;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - );
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[gkey UTF8String], 此处key的长度 和下面参数指定的长度要相同
kCCKeySizeDES, //key的长度为24位,所以 vkey必须是24位长度
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [GTMBase64 stringByEncodingData:myData];
return result;
}
加密后结果:
p+X985x5bFS6dWjAnm6sdQ==
所以,选择合适的加密算法、秘钥长度、以及秘钥 是非常重要的搭配,搭配不好 就加密错误!!
iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败的更多相关文章
- JAVA 加密算法初探DES&AES
开发项目中需要将重要数据缓存在本地以便在离线是读取,如果不对数据进行处理,很容易造成损失.所以,我们一般对此类数据进行加密处理.这里,主要介绍两种简单的加密算法:DES&AES. 先简单介绍一 ...
- Java利用DES/3DES/AES这三种算法分别实现对称加密
转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...
- 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
- 加密算法 DES 3DES RSA AES 简介
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为[密文],使其只能在输入相应的[密钥]之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人 ...
- 对称(DES/AES)与非对称(RSA/SSL/数字证书)加密介绍及实际应用
本文不对具体的算法做深入研究,只是讲解各种安全算法的原理和使用场景. 一.数据校验算法 数据校验,是为保护数据的完整性,用一种指定的算法对原始数据计算出的一个校验值.当接收方用同样的算法再算一次校验值 ...
- 对称加密算法DES、3DES和AES 原理总结(转载)
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
- iOS 3DES加密解密(一行代码搞定)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- 简进祥==iOS 3DES加密解密
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- DES|3DES|AES|RSA|DH | CA | SSL(HTTPS)
1.对称密钥算法: 加解密速度块,算法使安全的,已知算法无法推出密钥.但是密钥的分发困难. DES:对称密钥算法,是一种块加密算法,只有一个密钥.加解密都是用一个密钥. 3DES:与DES一样,可以认 ...
随机推荐
- Android之ContentProvider总结
1.适用场景 1) ContentProvider为存储和读取数据提供了统一的接口 2) 使用ContentProvider,应用程序可以实现数据共享 3) android内置的许多数据都是使用Con ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- ajax轮询
oa.comet = function (id) { if (oa.id == 0) oa.id = id; $.ajax({ url: '/comet.asy?id=' + ...
- dzzoffice注册开启
dzzoffice默认安装注册选线是关闭的,需要在“系统设置”里打开. 设置方法 开始菜单=>系统设置=>注册与访问=> 将允许用户注册选勾,选上. 然后提交保存.
- $(document).ready()并不靠谱
好多用过jQuery的朋友都为jQuery的强大功能和易用性折服,有了jQuery菜鸟也能做javascript特效,有了jQuery高手写代码的效率会进一步提升. 学习jQuery的第一课就是学会在 ...
- cocos2dx 水波纹Shader
// on "init" you need to initialize your instance bool HelloWorld::init() { ////////////// ...
- public static void main(String arg[])
该语句定义了main方法. main方法是程序执行的入口,所有的java程序都必须具备一个main()方法,而且必须按照如上的格式来定义. 不具有main方法的类可以编译,但不能执行.因为它没有m ...
- 在C语言环境下使用google protobuf
本文写给经常使用C编程且不喜欢C++而又要经常使用google protobuf的人. 经常写通讯程序的人对数据进行序列化或者反序列化时,可能经常使用google的protobuf(PB ...
- arm tiny6410双网卡桥接问题
这几天做实验,想用arm tiny6410板子做个mesh网络节点.该板子本身自带一个lan网卡,我自己配了一个tp-link的usb无线网卡.其中wlan网卡工作在adhoc模式下,作为mesh骨干 ...
- CSStickyHeaderFlowLayout collectionView headerView 悬浮
github:https://github.com/levyleo/CSStickyHeaderFlowLayout iOS 10 使用时会出现崩溃:https://github.com/CSStic ...