美文网首页
没有添加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加密

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