在某些考虑数据安全的场景下,我们常常会用到加密解密、编码解码知识。比如把用户密码保存到数据库上,常用的方式是通过MD5或SHA1不可逆算法进行加密后密文保存。

这里主要介绍三种常用的加密算法:

(1)不可逆:MD5、SHA1

(2)可逆:AES256

另外常用的编码方式:

(1)可逆:Base64

main.m

 //
// main.m
// OCEncryptionAlgorithm: UTF8String, cStringUsingEncoding, dataUsingEncoding, base64EncodedStringWithOptions, initWithBase64EncodedString, initWithData (加密算法)(扩展知识:Base64编码)
//
// Created by Kenmu on 15/5/12.
// Copyright (c) 2015年 Kenmu. All rights reserved.
// #import <Foundation/Foundation.h>
#import "KMEncryption.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
//-------------------------MD5加密和SHA1加密
NSString *strSource = @"Kenmu-啊武";
NSLog(@"“%@”的MD5加密数据为:“%@”", strSource, [KMEncryption encryptByMD5:strSource]); NSLog(@"“%@”的SHA1加密数据为:“%@”", strSource, [KMEncryption encryptBySHA1:strSource]); //-------------------------AES256加密解密
NSString *strKey = @""; //strKey必须是32字节
NSData *data = [KMEncryption encryptByAES256:strSource withKey:strKey];
NSLog(@"“%@”的AES256加密数据为:“%@”", strSource, [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]); strSource = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
data = [KMEncryption decryptByAES256:strSource withKey:strKey];
NSLog(@"“%@”的AES256解密数据为:“%@”", strSource, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); //-------------------------Base64编码解码
strSource = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"“%@”的Base64编码数据为:“%@”", strSource, [KMEncryption encodeBase64String:strSource]); strSource = [KMEncryption encodeBase64String:strSource];
NSLog(@"“%@”的Base64解码数据为:“%@”", strSource, [KMEncryption decodeBase64String:strSource]);
}
return ;
}

KMEncryption.h

 #import <Foundation/Foundation.h>

 @interface KMEncryption : NSObject
/**
* MD5加密
*
* @param strSource 需要被加密的明文字符串
*
* @return MD5加密后的密文字符串
*/
+ (NSString *)encryptByMD5:(NSString *)strSource; /**
* SHA1加密
*
* @param strSource 需要被加密的明文字符串
*
* @return SHA1加密后的密文字符串
*/
+ (NSString *)encryptBySHA1:(NSString *)strSource; /**
* AES256加密
*
* @param strSource 需要被加密的明文字符串
* @param strKey 用于加密解密的32字节的密钥字符串(如不是32字节,就无法加密)
*
* @return AES256加密后的密文字符串
*/
+ (NSData *)encryptByAES256:(NSString *)strSource withKey:(NSString *)strKey; /**
* AES256解密
*
* @param strSource 需要被解密的密文字符串
* @param strKey 用于加密解密的32字节的密钥字符串(如不是32字节,就无法解密)
*
* @return AES256解密后的明文字符串
*/
+ (NSData *)decryptByAES256:(NSString *)strSource withKey:(NSString *)strKey; /**
* Base64编码
*
* @param strSource 需要被编码的字符串
*
* @return Base64编码后的字符串
*/
+ (NSString *)encodeBase64String:(NSString *)strSource; /**
* Base64解码
*
* @param strSource 需要被解码的字符串
*
* @return Base64解码后的字符串
*/
+ (NSString *)decodeBase64String:(NSString *)strSource; @end

KMEncryption.m

 //
// KMEncryption.m
// OCEncryptionAlgorithm
//
// Created by Kenmu on 15/5/12.
// Copyright (c) 2015年 Kenmu. All rights reserved.
// #import "KMEncryption.h"
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h> @implementation KMEncryption typedef NS_ENUM(NSUInteger, EncryptType) {
MD5,
SHA1
}; #pragma mark - 私有方法
/**
* MD5或SHA1加密
*
* @param strSource 需要被加密的明文字符串
* @param encryptType 加密类型;例如:MD5、SHA1
*
* @return 加密后的密文字符串
*/
+ (NSString *)encrypt:(NSString *)strSource encryptType:(EncryptType)encryptType {
NSString *strResult = nil;
const char *cSource = [strSource UTF8String]; //等同于[strSource cStringUsingEncoding:NSUTF8StringEncoding]
CC_LONG cSourceLen = (CC_LONG)strlen(cSource);
NSUInteger digestLen = ;
unsigned char arrOutputDigest[digestLen]; switch (encryptType) {
case MD5: {
CC_MD5(cSource, cSourceLen, arrOutputDigest);
break;
}
case SHA1: {
CC_SHA1(cSource, cSourceLen, arrOutputDigest);
break;
}
default: {
break;
}
} NSMutableString *mStrResult = [[NSMutableString alloc] init];
for (NSUInteger i=; i<digestLen; i++) {
[mStrResult appendFormat:@"%02x", arrOutputDigest[i]]; //每个字符数组元素以(不足2位就补0的)16进制输出,16*2=32位
}
strResult = mStrResult;
return strResult;
} /**
* AES256加密解密
*
* @param data 需要被加密解密的数据
* @param strKey 用于加密解密的32字节的密钥字符串(如不是32字节,就无法解密)
* @param isEncrypt 是否加密操作;YES为加密,NO为解密
*
* @return AES256加密解密后的数据
*/
+ (NSData *)operationByAES256:(NSData *)data withKey:(NSString *)strKey isEncrypt:(BOOL)isEncrypt {
NSData *dataResult = nil;
NSUInteger dataLen = [data length]; char keyPtr[kCCKeySizeAES256+]; //kCCKeySizeAES256=32
bzero(keyPtr, sizeof(keyPtr));
[strKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
size_t bufferSize = dataLen + kCCBlockSizeAES128; //kCCBlockSizeAES128=16;//对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小,所以在下边需要再加上一个块的大小
void *buffer = malloc(bufferSize);
size_t numBytesOperated = ;
CCCryptorStatus cryptStatus = CCCrypt(isEncrypt ? kCCEncrypt : kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[data bytes], dataLen, //输入
buffer, bufferSize, //输出
&numBytesOperated);
if (cryptStatus == kCCSuccess) {
dataResult = [NSData dataWithBytesNoCopy:buffer length:numBytesOperated];
}
return dataResult;
} #pragma mark - 公开方法
+ (NSString *)encryptByMD5:(NSString *)strSource {
NSString *strResult = nil;
if (strSource && strSource.length > ) {
strResult = [self encrypt:strSource encryptType:MD5];
}
return strResult;
} + (NSString *)encryptBySHA1:(NSString *)strSource {
NSString *strResult = nil;
if (strSource && strSource.length > ) {
strResult = [self encrypt:strSource encryptType:SHA1];
}
return strResult;
} + (NSData *)encryptByAES256:(NSString *)strSource withKey:(NSString *)strKey {
NSData *dataResult = nil;
if (strSource && strSource.length > && strKey && strKey.length == ) {
dataResult = [strSource dataUsingEncoding:NSUTF8StringEncoding]; //编码
dataResult = [self operationByAES256:dataResult
withKey:strKey
isEncrypt:YES];
}
return dataResult;
} + (NSData *)decryptByAES256:(NSString *)strSource withKey:(NSString *)strKey {
NSData *dataResult = nil;
if (strSource && strSource.length > && strKey && strKey.length == ) {
dataResult = [[NSData alloc] initWithBase64EncodedString:strSource
options:NSDataBase64DecodingIgnoreUnknownCharacters]; //解码
dataResult = [self operationByAES256:dataResult
withKey:strKey
isEncrypt:NO];
}
return dataResult;
} + (NSString *)encodeBase64String:(NSString *)strSource {
NSData *data = [strSource dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
} + (NSString *)decodeBase64String:(NSString *)strSource {
NSData *data = [[NSData alloc] initWithBase64EncodedString:strSource
options:NSDataBase64DecodingIgnoreUnknownCharacters];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
} @end

结果:

 -- ::36.203 OCEncryptionAlgorithm[:] “Kenmu-啊武”的MD5加密数据为:“d33ee89d8ea08c8d258df20b7836bd02”
-- ::36.204 OCEncryptionAlgorithm[:] “Kenmu-啊武”的SHA1加密数据为:“9bb7a793756842e38a76815bb03dd968”
-- ::36.204 OCEncryptionAlgorithm[:] “Kenmu-啊武”的AES256加密数据为:“1KQQ/bVAkRszh8Ue18VzMQ==”
-- ::36.204 OCEncryptionAlgorithm[:] “1KQQ/bVAkRszh8Ue18VzMQ==”的AES256解密数据为:“Kenmu-啊武”
-- ::36.204 OCEncryptionAlgorithm[:] “Kenmu-啊武”的Base64编码数据为:“S2VubXUt5ZWK5q2m”
-- ::36.205 OCEncryptionAlgorithm[:] “S2VubXUt5ZWK5q2m”的Base64解码数据为:“Kenmu-啊武”

加密算法(扩展知识:Base64编码)的更多相关文章

  1. 知识扩展——(转)一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...

  2. Base64编码知识详解

    在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...

  3. delphi Base64编码/解码及数据压缩/解压知识

    一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...

  4. Base64 编码知识,一文打尽!

    现在网站为了提升用户的浏览体验越来越多的使用了图片,而这些图片通常以 Base64 的形式存储和加载.因此各位开发工程师肯定对 Base64 毫不陌生了,那么你知道 Base64 究竟是什么,为什么要 ...

  5. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

  6. 浅谈Base64编码算法

    一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...

  7. 编码之Base64编码

    Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法.目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一. 为什么会有 Base64 编码呢?因为有些网 ...

  8. 《PHP 实现 Base64 编码/解码》笔记

    前言 早在去年 11 月底就已经看过<PHP 实现 Base64 编码/解码>这篇文章了,由于当时所掌握的位运算知识过于薄弱,所以就算是看过几遍也是囫囵吞枣一般,不出几日便忘记了其滋味. ...

  9. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

随机推荐

  1. 一文读懂BERT中的WordPiece

    1. 前言 2018年最火的论文要属google的BERT,不过今天我们不介绍BERT的模型,而是要介绍BERT中的一个小模块WordPiece. 2. WordPiece原理 现在基本性能好一些的N ...

  2. JAVA读取MongoDB中的二进制图片并在jsp中显示

    http://blog.csdn.net/u012138706/article/details/52180665

  3. dlib实现人脸landmark点检测以及一些其他的应用

    首先从中这里下载下代码: https://github.com/ageitgey/face_recognition#face-recognition 然后安装所以必须的组件,我用的Python3.5 ...

  4. JMeter (3) —— JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial)

    JMeter (3) -- JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial) 主要内容 JMeter录制脚本并进行压力测试用户登陆场景,并以CAS SSO单点 ...

  5. metrics 开发监控实现jdbc

    Metrics 主要有五大基本组件1:Counter  记录执行次数2:Gauge  获取某个值3:Meter  用来计算事件的速率4:Histogram  可以为数据流提供统计数据. 除了最大值,最 ...

  6. git 忽略已经添加到版本库的文件

    第一步: 指令:git rm -r --cached YOUR_PATH YOUR_PATH 即 你的文件,-r 指定了递归所有的子文件夹. 第二步: 修改项目根目录下的 .gitignore 文件, ...

  7. linux源配置

    阿里云源配置官网:http://mirrors.aliyun.com 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS ...

  8. tensorflow模型量化压缩

    参考 https://blog.csdn.net/xygl2009/article/details/80596392 https://blog.csdn.net/xsfl1234/article/de ...

  9. 推荐vue.js、layer.js、axios.js

    都是很简单又很实用的东西. vue.js,前端双向绑定框架. layer.js,前端遮罩层框架.(layui的一部分,可单独使用) axios.js,异步请求框架,用起来比jQuery的ajax舒服一 ...

  10. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...