iOS POS之3DES加密,iospos3des
最近在做支付類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;
}
以上就是全部代碼,這裡只給出了加密的代碼,其實解密的代碼也是一樣,只是代碼中的 kCCEncrypt改為
kCCDecrypt之後就由加密變成瞭解密。
這就是iOS中的3DES加密,只是針對於8583報文的3DES加密,至於其他地方遇到的3DES加密也許會略有不同,但總體來說流程就是這樣。
如有問題歡迎來跟我一起討論 ———— LC