3DES加解密 支持工作模式CBC pkcs5padding(填充方式)

很多java服务器对3des的加解密支持的是CBC/pkcs5padding方式,但是iOS这边大部分使用的是kCCOptionPKCS7Padding的填充方式,所以要做个对应处理才可行。
注意3des加解密的偏移量一定要和服务端保持一致,如果发现加密数据不一致请检查这个偏移量是否设置正确

  • 需要导入的文件是:
    #import <CommonCrypto/CommonDigest.h>
    #import <CommonCrypto/CommonCrypto.h>

3DES 加密方法(工作模式CBC/填充方式pkcs5padding)

/*
3des加密 。秘钥说明:gkey使用24位或者32位字符串
*/
+(NSString *)doEncryptStr:(NSString *)originalStr dKey:(NSString *)gkey qIv:(NSString *)gIv{
//把string 转NSData
NSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];
//length
size_t plainTextBufferSize = [data length];
const void *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 *) [gkey UTF8String];
//偏移量
const void *vinitVec = (const void *) [gIv UTF8String];
//配置CCCrypt
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES, //3DES
kCCOptionPKCS7Padding, //设置模式//cbc工作模式下,不要设置cbc,填充方式使用kCCOptionPKCS7Padding和pkcs5是一样的。但是位移量gIv需要保持一致
vkey,  //key
kCCKeySize3DES,
vinitVec,  //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@""
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSString *result = [GTMBase64 stringByEncodingData:myData];
return result;
}

3DES 解密方法(工作模式CBC/填充方式pkcs5padding)

//3des字符串解密
+(NSString*)doDecEncryptStr:(NSString *)encryptStr dKey:(NSString *)gkey qIv:(NSString *)gIv{
NSData *encryptData = [GTMBase64 decodeData:[encryptStr dataUsingEncoding:NSUTF8StringEncoding]];
size_t plainTextBufferSize = [encryptData length];
const void *vplainText = [encryptData 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 *) [gkey UTF8String];
const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCDecrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,//cbc工作模式下,不要设置cbc,填充方式使用kCCOptionPKCS7Padding和pkcs5是一样的。但是位移量gIv需要保持一致
vkey,
kCCKeySize3DES,
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
return result;
}

GTMBase64地址
给大家提供一个在线3DES加解密验证地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 13,963评论 5 29
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 8,266评论 0 14
  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 7,964评论 0 6
  • 她是一个很单纯的女孩,看着那个坐在她后排的男生打动了她年少的心扉。他们恋爱了,很单纯很单纯的恋爱,每天写一封信,互...
    某某人_3794阅读 1,634评论 0 0
  • 很多时候我都困得像囚徒的眼泪总在梦里凿开二次元通道那里没有一丝黑暗我赤身裸体在海天之间恣意徜徉——2017-09-07
    小者阅读 4,966评论 0 0

友情链接更多精彩内容