iOS DES,AES加密

最近在准备面试,发现之前项目中用到的加密技术都记得不清楚了,所以总结一下。之前项目用到的加密技术一种是DES加密,用来加密发送请求的字段,保证服务器数据的安全,一种是AES加密,用于加密登录时发送的账号密码数据。

一 . DES加密

DES加密属于对称加密算法,即信息的发送者与接受者在进行信息的传输与处理上使用的同一秘钥。

直接上代码,新建DESEncry文件,.h文件中:

#import <Foundation/Foundation.h>

@interface DESEncry : NSObject

/**

* @brief 对文本进行DES加密

*

* @param data    待加密的文本数据

* @param key 加密所有的公钥

* @param iv 加密向量

*

* @return 加密好的数据

*/

+ (NSData *)encryptUseDES:(NSString *)string key:(NSString *)key iv:(const void *)iv;

/**

* @brief 对文本进行DES解密

*

* @param data    待解密的数据

* @param key 解密所用的公钥

*

* @return 解密好的数据

*/

+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key;

@end

.m文件:

#import "DESEncry.h"

#import <CommonCrypto/CommonCryptor.h>

@implementation DESEncry

+ (NSData *)encryptUseDES:(NSString *)string key:(NSString *)key iv:(const void *)iv

{

const char *textBytes = [string UTF8String];

NSUInteger dataLength = strlen(textBytes);

NSMutableData *data = [NSMutableData new];

NSUInteger n = dataLength / 1024;

for (int i = 0; i <= n;i++){

unsigned char buffer[1024];

unsigned char temp[1024];

memset(buffer, 0, sizeof(char));

memset(temp, 0, sizeof(char));

strncpy((char*)temp,textBytes, i==n?dataLength-1024*n:1024);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding|kCCOptionECBMode,

[key UTF8String], kCCKeySizeDES,

iv,

temp, i==n?dataLength-1024*n:1024,

buffer, 1024,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

[data appendData:[NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted]];

}

}

return data;

}

+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key

{

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [data length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding | kCCOptionECBMode,

keyPtr, kCCBlockSizeDES,

NULL,

[data bytes], dataLength,

buffer, bufferSize,

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer);

return nil;

}

@end

项目中具体调用:

 NSString *str=HOST;

_hostUrl = [str stringByAppendingString:@"opt=click&page=Login"];

NSDictionary * resultdic  = @{@"pwd":pwd,@"uid":uid};

NSString *strReq = [TypeConversion jsonStringWithDictionary:resultdic];

//加密

Byte iv[] = {1,2,3,4,5,6,7,8};

NSData * data = [DESEncry encryptUseDES:strReq key:@"zywl9876" iv:iv];

NSString *str5 = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];

_paramDict = @{@"_json":str5};

二 . AES加密

AES也是属于对称加密算法,不过安全级别比DES高。

上代码,新建MySecurity文件,.h文件中

#import <Foundation/Foundation.h>

@interface MySecurity : NSObject

#pragma mark -根据密匙初始化

-(instancetype) initWithKey:(NSString *) key;

#pragma mark -加密

-(NSString *) AES256EncryptWithString:(NSString *) str;

#pragma mark -解密

-(NSString *) AES256DecryptWithString:(NSString *) str;

#pragma mark -获取安全密匙

+(NSString*) getSecurityKey;

@end

.m文件:

#import "MySecurity.h"

#import "NSData+AES256.h"

@interface MySecurity ()

@property(strong,nonatomic) NSString *key;

@end

@implementation MySecurity

#pragma mark -获取安全钥匙

+(NSString*) getSecurityKey

{

return @"KEY";

}

#pragma mark -更加密码密匙初始化

-(instancetype) initWithKey:(NSString *) key

{

self = [super init];

if (self)

{

self.key = key;

}

return self;

}

#pragma mark -加密

-(NSString *) AES256EncryptWithString:(NSString *) str

{

NSData *dt1 = [str dataUsingEncoding:NSUTF8StringEncoding];

NSData *dt2 = [dt1 AES256EncryptWithKey:self.key];

NSString *str2 = [dt2 base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

return str2;

}

#pragma mark -解密

-(NSString *) AES256DecryptWithString:(NSString *) str

{

NSData *dt3 = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];

NSData *dt4 = [dt3 AES256DecryptWithKey:self.key];

NSString *str4 = [[NSString alloc] initWithData:dt4 encoding:NSUTF8StringEncoding];

return str4;

}

新建一个NSData的类别:

#import <Foundation/Foundation.h>

@interface NSData (AES256)

/*

加密

(NSString*)key 32位秘钥

返回加密后的 NSData

*/

- (NSData*)AES256EncryptWithKey:(NSString*)key ;

/*

解密

(NSString*)key 32位秘钥

返回解密后的 NSData

*/

- (NSData*)AES256DecryptWithKey:(NSString*)key ;

@end

.m文件

#import "NSData+AES256.h"

#import <CommonCrypto/CommonCryptor.h>

@implementation NSData (AES256)

- (NSData*)AES256EncryptWithKey:(NSString*)key {

char keyPtr[kCCKeySizeAES256 +1]; // room for terminator (unused)

bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize           = dataLength + kCCBlockSizeAES128;

void* buffer                = malloc(bufferSize);

size_t numBytesEncrypted    = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,

kCCAlgorithmAES128,

kCCOptionPKCS7Padding|kCCOptionECBMode,

keyPtr,

kCCKeySizeAES256,

NULL /* initialization vector (optional) */,

[self bytes],

dataLength, /* input */

buffer,

bufferSize, /* output */

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);

return nil;

}

- (NSData*)AES256DecryptWithKey:(NSString*)key {

char keyPtr[kCCKeySizeAES256+1 ]; // room for terminator (unused)

bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

// fetch key data

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize           = dataLength + kCCBlockSizeAES128;

void* buffer                = malloc(bufferSize);

size_t numBytesDecrypted    = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

kCCAlgorithmAES128,

kCCOptionPKCS7Padding|kCCOptionECBMode,

keyPtr,

kCCKeySizeAES256,

NULL /* initialization vector (optional) */,

[self bytes],

dataLength, /* input */

buffer,

bufferSize, /* output */

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer); //free the buffer;

return nil;

}

@end

项目中的具体调用:

MySecurity *security = [[MySecurity alloc] initWithKey:[MySecurity getSecurityKey]];

//AES加密

NSMutableDictionary*dic = [[NSMutableDictionary alloc]initWithObjectsAndKeys:self.userTF.text,@"LoginName",self.pswTF.text,@"Password", nil];

NSData*data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];

NSString*dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

NSString * str1 = [security AES256EncryptWithString:dataStr];

原文地址:https://www.cnblogs.com/cui-cui/p/9559087.html

时间: 2024-11-09 02:43:19

iOS DES,AES加密的相关文章

ios安全性---AES加密

数据加密在解密在软件开发过程中举足轻重的作用,可能有的公司在加密的时候有自己公司内部一套设计的算法,而在这方面不想浪费太大精力就可以去考虑使用第三方提供的加密算法,如AES加密算法,本篇内容介绍开源中国iOS客户端使用ASE算法加密密码: AES   GitHub 下载地址  https://github.com/Gurpartap/AESCrypt-ObjC 对一个比较大的工程我们可能都不知道某个类库或者方法在哪被使用,但是智能的Xcode给我们提供了一个全局搜索的功能,我们可以在真个工程中来

iOS之AES加密解密

//AES加密解密#import <CommonCrypto/CommonCrypto.h>#import <CommonCrypto/CommonDigest.h> //AES128位加密 base64编码 注:kCCKeySizeAES128点进去可以更换256位加密 -(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key { char keyPtr[kCCKeySizeAES128+1];//

iOS开发——AES加密(128 CBC/ECB NoPadding/PKCS7Padding)

项目开发过程中,经常会使用各种加密手段来保证数据的安全性,常见的有MD5,DES,AES等等.摘取百度百科AES词条的简介:AES即高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在20

密码学之DES/AES算法

DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来. DES使用简介 使用DES需要设置加密内容.加密key.加密混淆向量iv.分组密码模式.填充模式. 加密内容:给定的加密的数据.如果数据长度不是 n*分组大小,则在其后使用 '\0' 补齐. 加密Key:加密密钥. 如果密钥长度不是该算法所能够支持的

C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应位其中一个为1另一个为0,则返回1. //对数字加密 int P_int_Num, P_int_Key;//定义两个值类型变量 string Encryptstr = (P_int_Num ^ P_int_Key).ToString();//加密数值 //对数字解密 int P_int_Key, P_int_

iOS 开发笔记-andriod/java/iOS三方AES通用加密

移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,就几种语言的加密都实践了一遍,实现了.NET,java(andriod),iOS都同一套的加密算法,下面就分享给大家. AES加密有多种算法模式,下面提供两套模式的可用源码. 加密方式: 先将文本AES加密 返回Base64转码 解密方式: 将数据进行Base64解码 进行AES解密 一.CBC(Cipher Block Chaining,加密块链)模式 是一种循

【转】 iOS DES ECB模式对称加密解密

最近忙于android和iOS的项目,写完了android的DES 的ECB模式加密解密(相关连接:http://blog.csdn.net/vipa1888/article/details/8086037),又 回到了Ios上面,因为本人也是最近今年开始研究ios的,所以Ios上面好多东西都不懂,进过了半年的研究,终于吧ios的DES 的ECB模式对称加密解密搞定了,本人遇到的问题很严重的问题,网上写的好多16进制数转化位字节都有问题的,经过本人研究发现他们有一个地方写错了,导 致解密后的NS

IOS AES加密

AES GitHub 下载地址:https://github.com/Gurpartap/AESCrypt-ObjC AES支持密钥128位,192位,256位(常用的是128位 md5, 256位 sha256) 工作模式:ECB/CBC,默认情况下iOS是CBC的 iOS在设置加密参数的时候要添加参数 kCCOptionECBMode 填充方式:kCCOptionPKCS7Padding,iOS似乎只支持这样的填充方式,所以要引用第三方包bouncycastle (www.bouncycas

C#实现DES加密解密,AES加密解密

DES算法描述简介: DES是Data Encryption Standard(数据加密标准)的缩写.它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准:它是一个分组加密算法,他以64位为分组对数据加密.同时DES也是一个对称算法:加密和解密用的是同一个算法.它的密匙长度是56位(因为每个第8 位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变. /// <summary>   /// DES加密   /// </su