最近在做支付类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
版权声明:本文为博主原创文章,未经博主允许不得转载。