iOS POS之3DES加密
最近在做支付类APP,遇到了很多以前没遇到过的东西。接下来我会用这系列文章来记录我所遇到的问题。
首先就是在组8583报文时用到的3DES加密。8583报文是以字节为单位的所以可能3DES加密会有稍许不同。
我自己搞这个问题也搞了两天,最后还是拜托一个高手给搞定的。
我在网上也搜了很多资料最后发现有一帖子很接近答案。链接如下:
http://www.cocoachina.com/bbs/read.php?tid=245410
请教高手所做的就是把哈希那句给去掉然后稍微做下处理,有兴趣的同学可以自己做下对比。
经本人无数次验证没问题,首先给出一个加密的例子
/*
密文:EC643168D551763F1CC9762AD7ACF556
密钥:49D5E0D326518A10F7E5611A5B0D8054
明文:CD8DF81926A629C5715830F89981F278
*/
没什么说的直接上代码
+ (NSString *)threeDESEncrypt:(NSString *)plainText withKey:(NSString *)key{
//16进制字符串转为 data数据
NSData *data = [NSStringhexToBytes:key];
//组装解密key取前16个字节然后再次取前8个字节组成key
uint8_t *git = (uint8_t *)[databytes];
uint8_t keyByte[24];
for (int i=0; i<16; i++) {
keyByte[i] = git[i];
}
for (int i=0; i<8; i++) {
keyByte[16+i] = git[i];
}
NSData *EncryptData = [NSStringhexToBytes:plainText];
size_t plainTextBufferSize = [EncryptDatalength];
constvoid *vplainText = [EncryptDatabytes];
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);
constvoid *vkey = (constvoid *) keyByte;
ccStatus =CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionECBMode,
vkey,
kCCKeySize3DES,
nil,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSData *dataresult = [NSDatadataWithBytes:(constvoid *)bufferPtr
length:(NSUInteger)movedBytes];
NSString *result = [NSStringhexStringFromData:dataresult];
return [resultuppercaseString];
}
其中用到的两个方法如下
/**
* 十六 进制字符串转换为 data
* 24211D3498FF62AF --> <24211D34 98FF62AF>
*
* @param str 要转换的字符串
*
* @return 转换后的数据
*/
+(NSData*)hexToBytes:(NSString *)str{
NSMutableData* data = [NSMutableDatadata];
int idx;
for (idx =0; idx+2 <= str.length; idx+=2) {
NSRange range =NSMakeRange(idx,2);
NSString* hexStr = [strsubstringWithRange:range];
NSScanner* scanner = [NSScannerscannerWithString:hexStr];
unsignedint intValue;
[scannerscanHexInt:&intValue];
[dataappendBytes:&intValuelength:1];
}
return data;
}
/**
* data 转换为十六进制字符串
* <24211D34 98FF62AF> --> 24211D3498FF62AF
*
* @param data 要转换的data
*
* @return 转换后的字符串
*/
+ (NSString *)hexStringFromData:(NSData *)data{
NSMutableString *str = [NSMutableStringstring];
Byte *byte = (Byte *)[databytes];
for (int i =0; i<[datalength]; i++) {
// byte+i为指针
[strappendString:[selfstringFromByte:*(byte+i)]];
}
return str;
}
+ (NSString *)stringFromByte:(Byte)byteVal{
NSMutableString *str = [NSMutableString string];
//取高四位
Byte byte1 = byteVal>>4;
//取低四位
Byte byte2 = byteVal & 0xf;
//拼接16进制字符串
[str appendFormat:@"%x",byte1];
[str appendFormat:@"%x",byte2];
return str;
}
kCCDecrypt之后就由加密变成了解密。
这就是iOS中的3DES加密,只是针对于8583报文的3DES加密,至于其他地方遇到的3DES加密也许会略有不同,但总体来说流程就是这样。
如有问题欢迎来跟我一起讨论 ———— LC
iOS POS之3DES加密相关推荐
- iOS 加密算法之MD5加密使用
2020.06.04编辑 前言 对于加密算法这个概念我的确不太清楚,虽然我知道加密算法存在的意义,但是这并不妨碍我不知道加密算法具体都有哪些.所以今天这篇文章就是了大家一起学习开发中哪些加密算法. 在 ...
- iOS 3DES加密解密(一行代码搞定)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- 一行代码实现IOS 3DES加密解密
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- IOS加密技术之——3DES加密解密技术(记录)
IOS常用加密技术有三种:3DES.SHA1和MD5.其中,对称加密技术有:3DES和SHA1:非对称加密技术有:MD5: 对称加密:加密解密用的是同一个密钥. 非对称加密:生成公有密钥和私有密钥.一 ...
- 简进祥==iOS 3DES加密解密
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- java ios 3des_IOS开发入门之iOS 3DES加密 和 java 3DES 解密
本文将带你了解IOS开发入门之iOS 3DES加密 和 java 3DES 解密,希望本文对大家学ios有所帮助 对称加密算法 3des 在iOS 客户端加密算法 首先进入头文件: #impo ...
- java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...
java 中32位秘钥长度的 3des加密方法? java 中 3des加密 默认是24位秘钥的 现在需求是 32位秘钥加密 尝试很多种方法 解决 结果都不正确 // 密钥 private final ...
- JAVA的3DES加密代码转成oc_iOS之DES加密
项目是使用3DES算法,ECB分组加密模式. 我们后端使用的加密过程:对明文进行十六进制编码,在使用3DES加密.iOS端解密需要把密文进行二进制解码,再使用3DES解密.后来查阅资料看到,后端也可以 ...
- 3DES加密认识与使用
公司的项目需要用到3DES加密,于是自己学习了一下,下面分享一下学习内容: 3DES是三重数据加密算法块密码的通称,听到名字就知道与DES加密有关,简单的理解为用DES加密三次,通过增加DES的密钥长 ...
最新文章
- 数据库事务原理及并发、死锁
- 数据集与JSON对象互相转换
- Jsoup实现Iteye自动登录
- java.net.URISyntaxException的解决办法
- stk 坐标系_STK中文用户手册.pdf
- C# 线程间不能调用剪切板的问题
- impdp导入dmp文件ORA-39088: 文件名不能包含路径说明ORA-39001: 参数值无效ORA-39000: 转储文件说明错误
- java系统项目分为哪五大层次?控制层_业务_一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转...
- MySQL基础,DDL和DML(新人入门向)
- PyTorch 多目标跟踪
- 在线字符串哈希/散列加密工具
- 程序员让开,硅谷将是物理学家的天下,薪水高得离谱
- 推荐一款UI非常Good的 Redis 客户端工具
- 好多游戏,大部分都有修改器,大家赶紧下!
- 2020《互联网周刊》年度评选结果揭晓, Smartbi获三项行业大奖
- 案例:模拟京东快递单号查询 字体放大显示
- PKU四日游(信息科学夏令营)
- android修改默认的返回图标
- 某版本瑞数解决方案-爬虫
- script ‘D:\pycharm\Student‘ not found