iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败
2016-11-02 14:47
435 查看
今天做项目,需要进行3des加密。 加密的gkey:abcdefgh giv:(偏移量)abcdefgh
加密后结果:p+X985x5bFS6dWjAnm6sdQ==
下面是代码:
可以看到我代码中标红的地方:
kCCKeySize3DES = 24,
我们看一下这个参数的解释:
p+X985x5bFS6dWjAnm6sdQ==
加密后结果: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 = 0; size_t movedBytes = 0; bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 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 = 0; size_t movedBytes = 0; bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 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移动端使用AES加密注意事项
- iOS10.0 RSA加密注意事项
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- Nginx 做为代理服务器注意文件上传配置这块参数。否则会出现上传有时成功,有时失败的情况。千万记得设置。
- 选择SSL加密证书颁发公司的注意事项
- ios静态库制作中的注意事项
- IOSBase64和3DES加密
- 选择SSL加密证书颁发公司的注意事项
- 使用EFS加密数据的注意事项
- 代码操作注意事项,否则哭都没有地方啊!
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的”.pvr.ccz”,”.plist”共用的终极精灵优化及注意事项!
- iOS app store 程序 发布 上线 注意事项
- 在Xcode 4.3(4E109,iOS 5 SDK)上开发基于iOS 4.3应用的注意事项
- 移动开发:flash移植到IOS的注意事项
- IOS-selector注意事项:@selector(showAlertView:)
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- Git merge时候的注意事项 -- merge失败的话会导致不完整的merge
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- IOS 如果要给navigationBar设置背景,必须放在所有修改之后设置,否则IOS4.3会失败
- iOS与cocos2d乱七八糟的注意事项