美文网首页good
IOS 32个字节KEY 的 3DES 加密解密方式

IOS 32个字节KEY 的 3DES 加密解密方式

作者: 烽火七月 | 来源:发表于2016-11-15 11:51 被阅读439次

    前几天做项目的时候遇到了3DES的解密数据,KEY是服务端返回的。在网上查了好多篇文章,发现IOS中3DES的KEY必须是24位的,而服务端传过来的KEY是32个字节的,那怎么办呢?还有偏移量又该怎么办呢?研究了好久,也看了很多大牛的文章,现在我就借花献佛,稍稍总结一下。demo最后给出。

主要的就是要组装解密KEY(并不需要GTMBase64),其次是偏移量要传nil      不多说直接看代码吧。

+ (NSString *)threeDESEncrypt:(NSString *)plainText withKey:(NSString *)key{

//16进制字符串转为 data数据

NSData  *data = [self hexToBytes:key];

//组装解密key取前16个字节然后再次取前8个字节组成key

uint8_t *git = (uint8_t *)[data bytes];

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 = [self hexToBytes:plainText];

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 *) keyByte;

ccStatus =CCCrypt(kCCEncrypt,

kCCAlgorithm3DES,

kCCOptionECBMode,

vkey,

kCCKeySize3DES,

nil,                //偏移量 直接传nil 不能传@“”

vplainText,

plainTextBufferSize,

(void *)bufferPtr,

bufferPtrSize,

&movedBytes);

NSData *dataresult = [NSData dataWithBytes:(const void *)bufferPtr

length:(NSUInteger)movedBytes];

NSString *result = [self hexStringFromData:dataresult];

return [result uppercaseString];

}

+ (NSString *)threeDESDecrypt:(NSString *)plainText withKey:(NSString *)key{

//16进制字符串转为 data数据

NSData  *data = [self hexToBytes:key];

//组装解密key取前16个字节然后再次取前8个字节组成key

uint8_t *git = (uint8_t *)[data bytes];

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 = [self hexToBytes:plainText];

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 *) keyByte;

ccStatus =CCCrypt(kCCDecrypt,

kCCAlgorithm3DES,

kCCOptionECBMode,

vkey,

kCCKeySize3DES,

nil,

vplainText,

plainTextBufferSize,

(void *)bufferPtr,

bufferPtrSize,

&movedBytes);

NSData *dataresult = [NSData dataWithBytes:(const void *)bufferPtr

length:(NSUInteger)movedBytes];

NSString *result = [self hexStringFromData:dataresult];

return [result uppercaseString];

}

//其中用到的两个方法如下

/**

*  十六 进制字符串转换为 data

*  24211D3498FF62AF  -->  <24211D34 98FF62AF>

*

*  @param str 要转换的字符串

*

*  @return 转换后的数据

*/

+(NSData*)hexToBytes:(NSString *)str{

NSMutableData* data = [NSMutableData data];

int idx;

for (idx = 0; idx+2 <= str.length; idx+=2) {

NSRange range = NSMakeRange(idx,2);

NSString* hexStr = [str substringWithRange:range];

NSScanner* scanner = [NSScanner scannerWithString:hexStr];

unsigned int intValue;

[scanner scanHexInt:&intValue];

[data appendBytes:&intValue length:1];

}

return data;

}

/**

*  data 转换为十六进制字符串

*  <24211D34 98FF62AF>  -->  24211D3498FF62AF

*

*  @param data 要转换的data

*

*  @return 转换后的字符串

*/

+ (NSString *)hexStringFromData:(NSData *)data{

NSMutableString *str = [NSMutableString string];

Byte *byte = (Byte *)[data bytes];

for (int i =0; i<[data length]; i++) {

// byte+i为指针

[str appendString:[self stringFromByte:*(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;

}

demo:     https://github.com/shadowKnight0/WYDEncrypt

相关文章

  • Android Des/3DES加解密

    1、3DES加解密 DES加密分为 单DES和 3DES加密 单DES加密是8个字节长度加密 3DES加密分为:双...

  • iOS常用加解密方式

    AES128 AES128加密 AES128解密 3DES 3DES加密 3DES解密 DES DES加密 DES解密

  • RSA加解密学习笔记

    RSA加解密简单说明: RSA是非对称加密方式,就是说加密解密不是同一个Key。私钥加密公钥解密,待加密的明文字节...

  • Laravel 3DES (php、java、android、i

    Laravel 3DES Laravel 3DES加密解密,和java,ios互通 安装方法 配置方法 app.p...

  • IOS 32个字节KEY 的 3DES 加密解密方式

    前几天做项目的时候遇到了3DES的解密数据,KEY是服务端返回的。在网上查了好多篇文章,发现IOS中3DES...

  • 3DES企业级加密与解密

    一、加密方案 HTTP请求参数以json密文传输使用3DES方式加密,3DES(data,KEY,IV),其中da...

  • 面试题总结

    1. iOS开发中的加密方式 iOS加密相关算法框架:CommonCrypto。 对称加密: DES、3DES、A...

  • IOS的签名机制

    前言 了解IOS的数字签名机制之前我们需要掌握以下几个知识:加密解密(对称加密(DES 3DES AES),非对称...

  • iOS逆向-09:对称加密

    对称加密 加密解密使用同一个KEY常见的三个 DES 数据加密标准(用的少,强度不够) 3DES 使用三个密钥,对...

  • 密码学中的对称加密和非对称加密

    一、对称加密概念:加密和解密用同一对密钥的加密技术,叫对称加密。加密方式:DES、3DES、AES,安全性依次从低...

网友评论

    本文标题:IOS 32个字节KEY 的 3DES 加密解密方式

    本文链接:https://www.haomeiwen.com/subject/dlleyttx.html