1. md5:

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。(引用自百度百科)

MD5加密目前来说是不可逆的,只能用作一些检验过程,不能恢复其原文。

MD5算法产生的是固定的128bit,即128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制数,说白了也就是32个16进制的数字。

需要引入头文件:

#import <CommonCrypto/CommonDigest.h>

#define CC_MD5_DIGEST_LENGTH    16          /* digest length in bytes */
- (NSString *)md5:(NSDictionary *)paramsDict {
NSString *inString = [paramsDict stringValueForKey:@"data" defaultValue:@""];if (inString.length <= 0) {return @"";} else {const char *cStrValue = [inString UTF8String];//开辟一个16字节(128位:md5加密出来就是128位/bit)的空间(一个字节=8字位=8个二进制数)unsigned char outResult[CC_MD5_DIGEST_LENGTH];CC_MD5(cStrValue, strlen(cStrValue), outResult);//x表示十六进制,X  意思是不足两位将用0补齐,如果多余两位则不影响NSString *outString =[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",outResult[0], outResult[1], outResult[2], outResult[3],outResult[4], outResult[5], outResult[6], outResult[7],outResult[8], outResult[9], outResult[10], outResult[11],outResult[12], outResult[13], outResult[14], outResult[15]];/*//方法二:NSMutableString *outString = [NSMutableString string];for (int i = 0; i < 16; i++) {[outString appendFormat:@"X", outResult[i]];}*/return outString;}}

为什么是[16]呢,这是因为MD5算法最后生成的是128位,而在计算机的最小存储单位为字节,1个字节是8位,对应一个char类型,计算可得需要16个char。所以result是[16]。那么为什么输出的格式一定是%02x呢,而不是其它呢。这也是有原因的:因为约定MD5一般是以16进制的格式输出,那么其实这个问题就转换为把128个0和1以16进制来表示,每4位二进制对应一个16进制的元素,则需要32个16进制的元素,如果元素全部为0,放到char的数组中,正常是不会输出,如00001111,以%x输出,则是f,那么就会丢失0;但如果以%02x表示则输出结果是0f,正好是转换的正确结果。

2. sha1 加密

SHA1 算法一样不可逆。

- (NSString *) sha1:(NSString *)input
{const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];NSData *data = [NSData dataWithBytes:cstr length:input.length];//#define CC_SHA1_DIGEST_LENGTH   20       /* digest length in bytes */
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];CC_SHA1(data.bytes, data.length, digest);NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {[output appendFormat:@"%02x", digest[i]];}return output;
}

3. AES 加密

高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。

需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。

需要引入头文件

#import <CommonCrypto/CommonCryptor.h>

加密和解密方法使用的参数密钥可以均为32位长度的字符串,可以将任意的字符串经过md5计算32位字符串作为密钥,也可以自定义如:

#define APP_PUBLIC_PASSWORD     @"boundary"

- (NSData *)AES256EncryptWithKey:(NSString *)key  withString:(NSString *) inputString { //加密NSData *inData = [inString dataUsingEncoding:NSUTF8StringEncoding];/***//如果希望返回字符串,在开始时就开始对 NSData 做转换, 对应下面方法三,方法一和二使用上面语句即可const char *cstr = [inString cStringUsingEncoding:NSUTF8StringEncoding];NSData *inData = [NSData dataWithBytes:cstr length:inString.length];***/char keyPtr[kCCKeySizeAES256+1];bzero(keyPtr, sizeof(keyPtr));[APP_PUBLIC_PASSWORD getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];NSUInteger dataLength = [inData length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize);size_t numBytesEncrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding | kCCOptionECBMode,keyPtr, kCCBlockSizeAES128,NULL,[inData bytes], dataLength,buffer, bufferSize,&numBytesEncrypted);if (cryptStatus == kCCSuccess) {NSData *outData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];return outData;/***//如果需要返回 NSString 类型的结果,这里需要进行转换:// 方法一:NSString *outString = [[NSString alloc]initWithData:outData encoding:NSUTF8StringEncoding];   //失败,注意:这里 outString 为 nil,具体原因貌似是因为 NSData 内容含有非encoding编码的字符// 方法二:NSString *outString = [outData base64Encoding];// 方法三:(转换为2进制字符串)if (outData && outData.length > 0) {Byte *datas = (Byte*)[outData bytes];NSMutableString *outString = [NSMutableString stringWithCapacity:outData.length * 2];for(int i = 0; i < outData.length; i++){[outString appendFormat:@"%02x", datas[i]];}}***/} free(buffer);return nil;
}
//解密可以直接使用加密得到的结果 NSData, 这样将很容易,不必进行字符转换
- (NSData *)AES256DecryptWithKey:(NSString *)key withNSData:(NSString *)inData {//解密/***
- (NSData *)AES256DecryptWithKey:(NSString *)key withString:(NSString *)inputString {//解密//对应加密算法中的方法二:(解密前进行GTMBase64编码)NSData *inData = [GTMBase64 decodeString:inString];//对应加密算法中的方法三:NSMutableData *inData = [NSMutableData dataWithCapacity:inString.length / 2];unsigned char whole_byte;char byte_chars[3] = {'\0','\0','\0'};int i;for (i=0; i < [inString length] / 2; i++) {byte_chars[0] = [inString characterAtIndex:i*2];byte_chars[1] = [inString characterAtIndex:i*2+1];whole_byte = strtol(byte_chars, NULL, 16);[inData appendBytes:&whole_byte length:1];}***/     char keyPtr[kCCKeySizeAES256+1];bzero(keyPtr, sizeof(keyPtr));//使用 "key": #define APP_PUBLIC_PASSWORD     @"boundary"[APP_PUBLIC_PASSWORD getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];NSUInteger dataLength = [inData length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize);size_t numBytesDecrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,          kCCAlgorithmAES128,kCCOptionPKCS7Padding | kCCOptionECBMode,keyPtr, kCCBlockSizeAES128,NULL,[inData bytes], dataLength,buffer, bufferSize,&numBytesDecrypted);if (cryptStatus == kCCSuccess) {NSData *outData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];return outData;/***//若需返回 NSString,需要上面加密算法和解密算法的各个方法对应好,使用下列语句才不会返回 nil; 切记 dataLength 一定匹配好NSString *outString = [[NSString alloc]initWithData:outData encoding:NSUTF8StringEncoding];***/}free(buffer);return nil;
}

4. base 64 加密算法

下载库 GTMBase64

实例demo:

http://up.2cto.com/2012/1215/20121215123257741.zip

iOS开发之算法加密md5,sha1,AES,base64相关推荐

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

    一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应 ...

  2. python学习-通过md5/sha1/sha256/base64进行加解密

    hashlib模块为加密算法 MD5算法运行1000次的平均时间为:226ms SHA1算法运行1000次的平均时间为:308ms SHA256算法运行1000次的平均时间为:473ms 常见的为后面 ...

  3. iOS开发-DES加密解密算法

    前几天后台给了一个Java代码的加解密方式,让我这边直接用.我对应着Java上解密方法找到一些适合iOS的DES加解密算法,特总结一下 1.使用DES加密: //加密 +(NSString *) en ...

  4. IOS开发之----常用加密方法

    本文转载至 http://blog.csdn.net/wildfireli/article/details/23191983 (AES.MD5.Base64) 分类: iPhone 2014-04-0 ...

  5. Vue-常用加密(MD5,DES,SHA256,BASE64,SHA1,RSA)

    加密解密介绍 DES 美国 数据加密标准(DES)是对称密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立.密钥较短,加密处理简单,加解密速度快,适用于加密大量数据的场合. 前端有时把数据传 ...

  6. 实现 JavaScript 哈希算法 包含 md5, sha1 sha256

    在解ob混淆时 发现其中作者实现的几种哈希算法,觉得写的不错,遂拿来分享给大家 MD5算法 function hash_md5(_0x5be8e2) {function _0x3cf213(_0x5c ...

  7. iOS开发面试的43道最新面试题,让你稳拿大厂offer

    话不多说先看题,看看你能回答多少! 1:谈谈你对KVC的理解 2:iOS项目中引用多个第三方库引发冲突的解决方法 3:GCD实现多读单写 4:讲一下atomic的实现机制:为什么不能保证绝对的线程安全 ...

  8. Base-N 算法加密解密实现:

    目录 Base-N 算法加密解密实现: Base64 加密解密:(C 语言.python) Base32 加密解密:(C 语言) Base-N 算法加密解密实现: Base64 加密解密:(C 语言. ...

  9. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  10. Android直播开发之旅(25):使用AES算法加密多媒体文件(+RSA+MD5+Base64)

    文章目录 1. AES算法 1.1 AES加密过程 1.1.1 字节代替(SubBytes) 1.1.2 行移位(ShiftRows) 1.1.3 列混合(MixColumns) 1.1.4 加轮密钥 ...

最新文章

  1. php 安装redis php扩展
  2. 2.4带通采样的实际问题
  3. 【拔刀吧少年】之shell数组
  4. [蓝桥杯][算法训练VIP]接水问题(思维)
  5. 怒肝 8 个月源码,我成为了 Spring 开源贡献者
  6. 非常时期,手机不能没电不能离身啊
  7. mysql 命令大小写_MySQL连接方式及大小写问题
  8. 中国计算机学会推荐国际学术期刊--数据库/数据挖掘/内容检索
  9. 2020全国计算机二级office大纲,2018-2020年(最新)全国计算机等级考试二级MS Office高级应用考试大纲...
  10. android View的层级结构
  11. 三调 图斑地类面积_国土三调APP-GIS,地理信息,综合管网,地下空间,给水排水,通信管网,燃气管网,智慧旅游,...
  12. HP台式计算机不能启动,惠普电脑不能启动怎么处理
  13. Xshell脚本学习
  14. unity3d游戏资源提取
  15. firefox 屏蔽Backspace按键的后退功能
  16. matlab平行线的中线,cad怎么画两条平行线的中线
  17. 教师基本功训练计算机,教师教学基本功培训方案
  18. Spring Boot 报错ThreadPoolTaskExecutor : Shutting down ExecutorService ‘applicationTaskExecutor‘
  19. Golang 给视频添加背景音乐 | Golang工具
  20. 图片CenterCrop和圆角问题(Glide加载)

热门文章

  1. 苹果mac os x系统的两种快捷截图技巧
  2. Gamma 矫正用于平衡光照不均匀
  3. [转帖]到底什么是时间复杂度
  4. 关于yum网络版仓库(本地yum仓库的安装配置,如果没网了,做一个局域网内的yum仓库)...
  5. [二分]TYVJ1359 收入计划
  6. 【BZOJ1116】[POI2008]CLO 并查集
  7. MOSS2010中如何用代码给托管元数据类型的栏目赋值
  8. 日期判断是今天/明天/后天
  9. 「拖放」Mac 的底层能力,也是效率神技
  10. Mac小知识:只需四步,教大家如何修改苹果电脑的DNS