iOS 3DES加密解密(一行代码搞定)

 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。

一行代码实现3DES加密解密需要用到写的 JKEncrypt  https://github.com/jukai9316/JKEncrypt。

下面先解析以下3DES的实现,然后再说,如何使用JKEncrypt。

注意点:填充方式不一样

在与后台交互的过程中,由于java 里面用的是PKCS5Padding,而iOS只有kCCOptionPKCS7Padding,所以用kCCOptionPKCS7Padding | kCCOptionECBMode 相当于PKCS5Padding。

 以下是3DES 256 在iOS开发中的实现:

 

#import <CommonCrypto/CommonDigest.h>  
#import <CommonCrypto/CommonCryptor.h>
#import <Security/Security.h>
#import "GTMBase64.h"

 

//密匙 key
#define gkey            @"Kyle_Chu"
//偏移量
#define gIv             @"jukai"

 

 

//字符串加密
-(NSString *)doEncryptStr:(NSString *)originalStr{
    
    //把string 转NSData
    NSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];
    
    //length
    size_t plainTextBufferSize = [data length];
    
    const void *vplainText = (const void *)[data 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 *) [gkey UTF8String];
    //偏移量
    const void *vinitVec = (const void *) [gIv UTF8String];
    
    //配置CCCrypt
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES, //3DES
                       kCCOptionECBMode|kCCOptionPKCS7Padding, //设置模式
                       vkey,    //key
                       kCCKeySize3DES,
                       vinitVec,     //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“”
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    NSString *result = [GTMBase64 stringByEncodingData:myData];
    return result;
}

 

//字符串解密
-(NSString*)doDecEncryptStr:(NSString *)encryptStr{
    
    NSData *encryptData = [GTMBase64 decodeData:[encryptStr dataUsingEncoding:NSUTF8StringEncoding]];
    
    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 *) [gkey UTF8String];
    
    const void *vinitVec = (const void *) [gIv UTF8String];
    
    ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding|kCCOptionECBMode,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                      length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
    
    
    return result;
}

 

十六进制的实现省略了,可以阅读JKEncrypt.m

JKEncrypt的使用:

 

//1、设置您需要的密匙、偏移量
//密匙 key
#define gkey            @"Kyle_Chu"
//偏移量
#define gIv             @"jukai"

 

// @"kyle_jukai" 是测试字符串,换成您需要加密的内容即可

JKEncrypt * en = [[JKEncrypt alloc]init];
//加密
NSString * encryptStr = [en doEncryptStr: @"kyle_jukai"];

NSString * encryptHex = [en doEncryptHex: @"kyle_jukai"];

NSLog(@"字符串加密:%@",encryptStr);
NSLog(@"十六进制加密:%@",encryptHex);
//解密
NSString *decEncryptStr = [en doDecEncryptStr:encryptStr];

NSString *decEncryptHex = [en doEncryptHex:encryptHex];

NSLog(@"字符串解密:%@",decEncryptStr);
NSLog(@"字符串解密:%@",decEncryptHex);

 

 

转载于:https://www.cnblogs.com/jukaiit/p/5039803.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中使用OpenSSL进行3DES CBC加解密,你可以使用OpenSSL的C语言接口来实现。以下是一个示例代码,演示了如何在Objective-C中使用OpenSSL进行3DES CBC加解密: ```objc // 导入OpenSSL头文件 #import <openssl/des.h> // 加密函数 NSString *encrypt3DESCBC(NSString *plainText, NSString *key, NSString *iv) { const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; const char *cIV = [iv cStringUsingEncoding:NSUTF8StringEncoding]; const char *cPlainText = [plainText cStringUsingEncoding:NSUTF8StringEncoding]; int plainTextLength = strlen(cPlainText); // 初始化3DES上下文 DES_cblock desKey; memset(desKey, 0, sizeof(DES_cblock)); memcpy(desKey, cKey, 24); DES_key_schedule keySchedule; DES_set_key_unchecked(&desKey, &keySchedule); // 加密 size_t bufferSize = plainTextLength + 8; unsigned char *buffer = malloc(bufferSize); memset(buffer, 0, bufferSize); DES_ncbc_encrypt((unsigned char *)cPlainText, buffer, plainTextLength, &keySchedule, (DES_cblock *)cIV, DES_ENCRYPT); // 将加密后的数据转换为十六进制字符串 NSMutableString *encryptedHex = [NSMutableString stringWithCapacity:bufferSize * 2]; for (int i = 0; i < bufferSize; i++) { [encryptedHex appendFormat:@"%02x", buffer[i]]; } free(buffer); return encryptedHex; } // 解密函数 NSString *decrypt3DESCBC(NSString *encryptedText, NSString *key, NSString *iv) { const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; const char *cIV = [iv cStringUsingEncoding:NSUTF8StringEncoding]; const char *cEncryptedText = [encryptedText cStringUsingEncoding:NSUTF8StringEncoding]; int encryptedTextLength = (int)[encryptedText length] / 2; // 初始化3DES上下文 DES_cblock desKey; memset(desKey, 0, sizeof(DES_cblock)); memcpy(desKey, cKey, 24); DES_key_schedule keySchedule; DES_set_key_unchecked(&desKey, &keySchedule); // 将十六进制字符串转换为加密后的数据 unsigned char *buffer = malloc(encryptedTextLength); memset(buffer, 0, encryptedTextLength); for (int i = 0; i < encryptedTextLength; i++) { sscanf(cEncryptedText + i * 2, "%2hhx", &buffer[i]); } // 解密 size_t bufferSize = encryptedTextLength; unsigned char *plainText = malloc(bufferSize); memset(plainText, 0, bufferSize); DES_ncbc_encrypt(buffer, plainText, bufferSize, &keySchedule, (DES_cblock *)cIV, DES_DECRYPT); free(buffer); return [[NSString alloc] initWithBytes:plainText length:bufferSize encoding:NSUTF8StringEncoding]; } ``` 使用示例: ```objc NSString *plainText = @"This is a secret message."; NSString *key = @"123456781234567812345678"; NSString *iv = @"12345678"; NSString *encryptedText = encrypt3DESCBC(plainText, key, iv); NSLog(@"Encrypted Text: %@", encryptedText); NSString *decryptedText = decrypt3DESCBC(encryptedText, key, iv); NSLog(@"Decrypted Text: %@", decryptedText); ``` 请确保你已经正确导入OpenSSL库,并且在编译设置中设置了正确的头文件搜索路径和链接库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值