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 = [EncryptData
length];

const
void *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);

const
void *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 [result
uppercaseString];

}

其中用到的两个方法如下

/**

*  十六
进制字符串转换为 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 = [str
substringWithRange:range];

NSScanner* scanner = [NSScannerscannerWithString:hexStr];

unsigned
int intValue;

[scannerscanHexInt:&intValue];

[dataappendBytes:&intValue
length: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<[data
length]; i++) {

// byte+i为指针

[strappendString:[selfstringFromByte:*(byte+i)]];

}

return str;

}

以上就是全部代码,这里只给出了加密的代码,其实解密的代码也是一样,只是代码中的 kCCEncrypt改为

kCCDecrypt之后就由加密变成了解密。

这就是iOS中的3DES加密,只是针对于8583报文的3DES加密,至于其他地方遇到的3DES加密也许会略有不同,但总体来说流程就是这样。

如有问题欢迎来跟我一起讨论 ———— LC

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-17 19:55:37

iOS POS之3DES加密的相关文章

iOS 3DES加密解密(一行代码搞定)

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

简进祥==iOS 3DES加密解密

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

3DES 加密 解密

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1d9421 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p4 { margin: 0.0px 0.0px 0.0px 0.

Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK

1, 采用银联ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 2, 采用3Des进行加密 参考: des和3Des加密算法实现 要点:因为3DES是对称加密算法,key是24位,当只有16位时,后8位取key的前8位 ANSI X9.8标准 PIN xor PAN获取PIN BlOCK (1) ANSI X9.8 Format(不带主账号信息) PIN(个人识别码 Personal Identity Number)总共有8个byte长度,分为两个部分;(类似数据包的格式)

C# Java 3DES加密解密 扩展及修正\0 问题

注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ----------------------------------------------------------- /// 说明: /// 转载自网上http://bbs.csdn.net/topics/350158619 /// 并加以扩展 /// 修正: /// 1. 修改正解密后出现 '\0' /// 注: 1. 向量不能小于8位 /// 2. 明文末尾如果是带'\0'字

C语言单片和C#语言服务器端DES及3DES加密的实现

原文:C语言单片和C#语言服务器端DES及3DES加密的实现 公司最近在做单片机和C#语言的通信.用的是Socket通信.传输的数据是明文,后来 在会上讨论准备用DES加密(对称加密)来做. 双方约定 相应的“密钥”. 以前做的加密一般都是用C#加密和C#解密.一直以为是个简单的问题,现在和用C写的单片机通信的时候却出了问题. 问题是什么呢? 我找了几个在线加密 解密的网站,还下了几个加密解密的工具.结果相同的数据,用相同的密钥却得到不同的结果. 而且现在网上C语言实现的DES资料基本上是不靠谱

java 3des加密问题记录

3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了 首先对于密钥的生成,java中有2种方式: 1.第一种,采用ECB模式和不填充模式 //加密 public static byte[] des3EncodeECB(byte[] key, byte[] data) throws Exception { Key deskey = null; SecretKeySpec spec = new SecretKeySpec(key,"de

C# 3DES加密解密,差点要了命

最近 一个项目.net 数据采用3DES加密.下面分享一下,这里的KEY采用Base64编码,便用分发,c#的Byte范围是0-255核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章一个是C#采用CBC Mode,PKCS7 Padding另一个是C#采用ECB Mode,PKCS7 Padding对字符加密时,采用的是UTF-8编码 下面是C#代码 /// <summary> /// DES3加密解密 /// </summary> public c

python 3Des 加密

import hashlib; from Crypto.Cipher import DES3 import base64 def create_key(sk): r=hashlib.md5(sk).digest() return r+r[:8] def init_str(s): l=len(s) % 16 if l!=0: c=16-l s+=chr(c)*c return s key='2345'#秘钥 b2bpwd="oohbv" keys=create_key(key) ss=i