IOS 纯DES加密 与 使用base64加密

2024-05-28 18:58
文章标签 使用 加密 ios des base64

本文主要是介绍IOS 纯DES加密 与 使用base64加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密
3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。
相较于DES3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。


使用前先下载GTMBase64 与 GTMDefines 文件;

用DES实现加密和解密的过程:(注释是我自己理解添加。不对的地方望指出)

.h文件中:

+ (NSString *)encryptWithText:(NSString *)sText;//加密  
+ (NSString *)decryptWithText:(NSString *)sText;//解密  

.m文件中  (导包: #import "GTMBase64.h"(下面说)   #import <CommonCrypto/CommonCryptor.h>

+ (NSString *)encryptWithText:(NSString *)sText  
{  //kCCEncrypt 加密  return [self encrypt:sText encryptOrDecrypt:kCCEncrypt key:@"des"];  
}  + (NSString *)decryptWithText:(NSString *)sText  
{  //kCCDecrypt 解密  return [self encrypt:sText encryptOrDecrypt:kCCDecrypt key:@"des"];  
}  + (NSString *)encrypt:(NSString *)sText encryptOrDecrypt:(CCOperation)encryptOperation key:(NSString *)key  
{  const void *dataIn;  size_t dataInLength;  if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码  {  //解码 base64  NSData *decryptData = [GTMBase64 decodeData:[sText dataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode  dataInLength = [decryptData length];  dataIn = [decryptData bytes];  }  else  //encrypt  {  NSData* encryptData = [sText dataUsingEncoding:NSUTF8StringEncoding];  dataInLength = [encryptData length];  dataIn = (const void *)[encryptData bytes];  }  /* DES加密 :用CCCrypt函数加密一下,然后用base64编码下,传过去 DES解密 :把收到的数据根据base64,decode一下,然后再用CCCrypt函数解密,得到原本的数据 */  CCCryptorStatus ccStatus;  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  NSString *initIv = @"12345678";  const void *vkey = (const void *) [key UTF8String];  const void *iv = (const void *) [initIv UTF8String];  //CCCrypt函数 加密/解密  ccStatus = CCCrypt(encryptOperation,//  加密/解密  kCCAlgorithmDES,//  加密根据哪个标准(des,3des,aes。。。。)  kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)  vkey,  //密钥    加密和解密的密钥必须一致  kCCKeySizeDES,//   DES 密钥的大小(kCCKeySizeDES=8)  iv, //  可选的初始矢量  dataIn, // 数据的存储单元  dataInLength,// 数据的大小  (void *)dataOut,// 用于返回数据  dataOutAvailable,  &dataOutMoved);  NSString *result = nil;  if (encryptOperation == kCCDecrypt)//encryptOperation==1  解码  {  //得到解密出来的data数据,改变为utf-8的字符串  result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding] autorelease];  }  else //encryptOperation==0  (加密过程中,把加好密的数据转成base64的)  {  //编码 base64  NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];  result = [GTMBase64 stringByEncodingData:data];  }  return result;  

测试:

NSString *encrypt = [ViewController encryptWithText:@"中华人民共和国万岁!!"];  NSLog(@"enctry = %@",encrypt);  NSString *decrypt = [ViewController decryptWithText:encrypt];  NSLog(@"decrypt = %@",decrypt); 



未使用base64加密 纯des加密

// 把一个byte数据转换为字符串
+(NSString *) parseByte2HexString:(Byte *) bytes;
// 把一个byte数组转换为字符串
+(NSString *) parseByteArray2HexString:(Byte[]) bytes;// nsData 转16进制
+ (NSString*)stringWithHexBytes2:(NSData *)sender;/****** 加密 ******/
+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key;
/****** 解密 ******/
+(NSString *) decryptUseDES:(NSString *)plainText key:(NSString *)key;

#import "DES.h"
#import <CommonCrypto/CommonCryptor.h>//static Byte iv[] = {'3','B','1','3','0','8','B','5'};//only Used for Cipher Block Chaining (CBC) mode,This is ignored if ECB mode is used
@implementation DES#pragma mark - DES_Mothed
/******************************************************************************函数描述 : 文本数据进行DES加密******************************************************************************/
+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
{NSString *ciphertext = nil;NSData *textData = [clearText dataUsingEncoding:NSUTF8StringEncoding];NSUInteger dataLength = [textData length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void * buffer = malloc(bufferSize);size_t numBytesEncrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,kCCOptionPKCS7Padding | kCCOptionECBMode,[key UTF8String], kCCBlockSizeDES,NULL,[textData bytes]  , dataLength,buffer, bufferSize,&numBytesEncrypted);if (cryptStatus == kCCSuccess) {NSLog(@"DES加密成功");NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];ciphertext = [self stringWithHexBytes2:data];}else{NSLog(@"DES加密失败");}free(buffer);return ciphertext;
}/******************************************************************************函数描述 : 文本数据进行DES解密******************************************************************************/
+(NSString *) decryptUseDES:(NSString *)plainText key:(NSString *)key
{NSString *cleartext = nil;NSData *textData = [self parseHexToByteArray:plainText];NSUInteger dataLength = [textData length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize);size_t numBytesEncrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,kCCOptionPKCS7Padding | kCCOptionECBMode,[key UTF8String], kCCKeySizeDES,NULL,[textData bytes]  , dataLength,buffer, bufferSize,&numBytesEncrypted);if (cryptStatus == kCCSuccess) {NSLog(@"DES解密成功");NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];cleartext = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];}else{NSLog(@"DES解密失败");}free(buffer);return cleartext;
}//nsdata转成16进制字符串
+ (NSString*)stringWithHexBytes2:(NSData *)sender {static const char hexdigits[] = "0123456789ABCDEF";const size_t numBytes = [sender length];const unsigned char* bytes = [sender bytes];char *strbuf = (char *)malloc(numBytes * 2 + 1);char *hex = strbuf;NSString *hexBytes = nil;for (int i = 0; i<numBytes; ++i) {const unsigned char c = *bytes++;*hex++ = hexdigits[(c >> 4) & 0xF];*hex++ = hexdigits[(c ) & 0xF];}*hex = 0;hexBytes = [NSString stringWithUTF8String:strbuf];free(strbuf);return hexBytes;
}/*将16进制数据转化成NSData 数组*/
+(NSData*) parseHexToByteArray:(NSString*) hexString
{int j=0;Byte bytes[hexString.length];for(int i=0;i<[hexString length];i++){int int_ch;  /// 两位16进制数转化后的10进制数unichar hex_char1 = [hexString characterAtIndex:i]; 两位16进制数中的第一位(高位*16)int int_ch1;if(hex_char1 >= '0' && hex_char1 <='9')int_ch1 = (hex_char1-48)*16;    0 的Ascll - 48else if(hex_char1 >= 'A' && hex_char1 <='F')int_ch1 = (hex_char1-55)*16;  A 的Ascll - 65elseint_ch1 = (hex_char1-87)*16;  a 的Ascll - 97i++;unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)int int_ch2;if(hex_char2 >= '0' && hex_char2 <='9')int_ch2 = (hex_char2-48);  0 的Ascll - 48else if(hex_char2 >= 'A' && hex_char1 <='F')int_ch2 = hex_char2-55;  A 的Ascll - 65elseint_ch2 = hex_char2-87;  a 的Ascll - 97int_ch = int_ch1+int_ch2;bytes[j] = int_ch;  ///将转化后的数放入Byte数组里j++;}NSData *newData = [[NSData alloc] initWithBytes:bytes length:hexString.length/2];return newData;
}+(NSString *) parseByte2HexString:(Byte *) bytes
{NSMutableString *hexStr = [[NSMutableString alloc]init];int i = 0;if(bytes){while (bytes[i] != '\0'){NSString *hexByte = [NSString stringWithFormat:@"%x",bytes[i] & 0xff];///16进制数if([hexByte length]==1)[hexStr appendFormat:@"0%@", hexByte];else[hexStr appendFormat:@"%@", hexByte];i++;}}return hexStr;
}+(NSString *) parseByteArray2HexString:(Byte[]) bytes
{NSMutableString *hexStr = [[NSMutableString alloc]init];int i = 0;if(bytes){while (bytes[i] != '\0'){NSString *hexByte = [NSString stringWithFormat:@"%x",bytes[i] & 0xff];///16进制数if([hexByte length]==1)[hexStr appendFormat:@"0%@", hexByte];else[hexStr appendFormat:@"%@", hexByte];i++;}}return [hexStr uppercaseString];
}@end

 NSString *keyString = @"bayilaoye#66#88";NSString *strString = @"我们都有一个家的权威的权威的权威的期望ccccMadison1234567890--";NSData *testData = [strString dataUsingEncoding: NSUTF8StringEncoding];//获取尺寸NSLog(@"加密前 资源数据strByte =:%@ \ndataLength  =: %ld",strString,[strString length]);NSString *strParse = [DES stringWithHexBytes2:testData];NSLog(@"加密前 16进制数据strParse =:%@ \nstrParseLength  =: %ld",strParse,[strParse length]);NSString * encryptBytes = [DES encryptUseDES:strString key:keyString];//加密NSLog(@"encryptBytes = %@ \nLength = :%ld", encryptBytes, [encryptBytes length]);NSString * decryptBytes = [DES decryptUseDES:encryptBytes key:keyString];//解密NSLog(@"decryptBytes = %@ \nLength =: %ld", decryptBytes, [decryptBytes length]);



这篇博客使用了des 与 base64 加密整合的 加密方式 确实写的不错 如果加密失败你可以修改存储内存值http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html
<div><p></p></div>

这篇关于IOS 纯DES加密 与 使用base64加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011414

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W