美文网首页
没有添加GTMBase64的DES加密

没有添加GTMBase64的DES加密

作者: 先生先森 | 来源:发表于2016-05-30 15:03 被阅读0次

最近突然项目突然需要使用DES加密,然后吧,又不是+GTMBase64的,网上找了很多的代码都是DES+GTMBase64的,而且解密的时候吧,返回是NULL,很是头大。找了好久才找到了一段代码可用,目前也没有时间去深入了解,看到网上有很多人都在问这个,所有将其分享一下。原文来至https://github.com/SalehAlDhobaie/DES。

使用:

NSString *cont1 = [DEST encryptSting:str1 key:key1 andDesiv:key1];

NSLog(@"加密结果:%@",cont1);

NSString *cont2 = [DEST decryptWithDESString:str2 key:key2 andiV:key2];

NSLog(@"解密结果:%@",cont2);

代码:

*********************************************************************************

#import@interface DEST : NSObject

//DES加密

+(NSString *)encryptSting:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes;

//DES解密

+(NSString *)decryptWithDESString:(NSString *)sText key:(NSString *)key andiV:(NSString *)iv;

@end

*********************************************************************************

#import "DEST.h"#import@implementation DEST

//DES加密

+(NSString *)encryptSting:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes

{

if ((sText == nil || sText.length == 0)

|| (sText == nil || sText.length == 0)

|| (ivDes == nil || ivDes.length == 0)) {

return @"";

}

//gb2312 编码

NSStringEncoding encoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSData* encryptData = [sText dataUsingEncoding:encoding];

size_t  dataInLength = [encryptData length];

const void *  dataIn = (const void *)[encryptData bytes];

//    CCCryptorStatus ccStatus = nil;

uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)

size_t dataOutMoved = 0;

size_t    dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);  dataOut = malloc( dataOutAvailable * sizeof(uint8_t));

memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0

const void *iv = (const void *) [ivDes cStringUsingEncoding:NSASCIIStringEncoding];

//CCCrypt函数 加密/解密

CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt,//  加密/解密

kCCAlgorithmDES,//  加密根据哪个标准(des,3des,aes。。。。)

kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)

[key UTF8String],  //密钥    加密和解密的密钥必须一致

kCCKeySizeDES,//  DES 密钥的大小(kCCKeySizeDES=8)

iv, //  可选的初始矢量

dataIn, // 数据的存储单元

dataInLength,// 数据的大小

(void *)dataOut,// 用于返回数据

dataOutAvailable,

&dataOutMoved);

//编码 base64

NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];

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

//下面是Byte 转换为16进制。

NSString *hexStr=@"";

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

NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数

if([newHexStr length]==1)

hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];

else

hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];

}

free(dataOut);

return hexStr;

}

//DES解密

+(NSString *)decryptWithDESString:(NSString *)sText key:(NSString *)key andiV:(NSString *)iv

{

if ((sText == nil || sText.length == 0)||

(sText == nil || sText.length == 0)||

(iv == nil || iv.length == 0)) {

return @"";

}

const void *dataIn;

size_t dataInLength;

char *myBuffer = (char *)malloc((int)[sText length] / 2 + 1);

bzero(myBuffer, [sText length] / 2 + 1);

for (int i = 0; i < [sText length] - 1; i += 2) {

unsigned int anInt;

NSString * hexCharStr = [sText substringWithRange:NSMakeRange(i, 2)];

NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];

[scanner scanHexInt:&anInt];

myBuffer[i / 2] = (char)anInt;

}

NSData *decryptData =[NSData dataWithBytes:myBuffer length:[sText length] / 2 ];//转成utf-8并decode

dataInLength = [decryptData length];

dataIn = [decryptData bytes];

free(myBuffer);

CCCryptorStatus ccStatus = nil;

uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)

size_t dataOutAvailable = 0; //size_t  是操作符sizeof返回的结果类型

size_t dataOutMoved = 0;

dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);

dataOut = malloc( dataOutAvailable * sizeof(uint8_t));

memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0

const void *ivDes = (const void *) [iv cStringUsingEncoding:NSASCIIStringEncoding];

//CCCrypt函数 加密/解密

ccStatus = CCCrypt(kCCDecrypt,//  加密/解密

kCCAlgorithmDES,//  加密根据哪个标准(des,3des,aes。。。。)

kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)

[key UTF8String],  //密钥    加密和解密的密钥必须一致

kCCKeySizeDES,//  DES 密钥的大小(kCCKeySizeDES=8)

ivDes, //  可选的初始矢量

dataIn, // 数据的存储单元

dataInLength,// 数据的大小

(void *)dataOut,// 用于返回数据

dataOutAvailable,

&dataOutMoved);

NSStringEncoding encoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSString *result  = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:encoding];

free(dataOut);

return result;

}

@end

相关文章

  • 没有添加GTMBase64的DES加密

    最近突然项目突然需要使用DES加密,然后吧,又不是+GTMBase64的,网上找了很多的代码都是DES+GTMBa...

  • 3DES加解密-iOS

    最近公司需要对url明文加密,经过讨论后使用了3DES加密 1.首先需要导入GTMBase64开源框架库 2.KC...

  • iOS开发中如何使用DES加密

    1.首先引入头文件 2.cocoaPods加入第三方框架GTMBase64,并引入头文件 3.DES分为加密和解密...

  • Android Des/3DES加解密

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

  • iOS常用加解密方式

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

  • 对称加密与非对称加密

    一.对称加密 常用的对称加密DES、AES,DES也有衍生的3DES等加密方式 对称加密用到的加密模式有ECB、C...

  • iOS 笔记之_时间戳 + DES 加密

    iOS 时间戳 + DES 加密 时间戳 DES 加密解密 加密内容:helloWorldDES加密成功加密结果:...

  • android 3DES加密和MD5加密

    经常使用加密算法:DES、3DES、RC4、AES,RSA等;对称加密:des,3des,aes非对称加密:rsa...

  • Android 加密解密的几种方式总结

    经常使用加密算法:DES、3DES、RC4、AES,RSA等; 对称加密:des,3des,aes 非对称加密:r...

  • 密码学-札记

    一、加密算法的选择: 1.1 对称加密: 不安全的加密算法: a.DES系加密算法(DES/DESX/3DES/2...

网友评论

      本文标题:没有添加GTMBase64的DES加密

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