加密算法(扩展知识:Base64编码)
在某些考虑数据安全的场景下,我们常常会用到加密解密、编码解码知识。比如把用户密码保存到数据库上,常用的方式是通过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编码)的更多相关文章
- 知识扩展——(转)一篇文章彻底弄懂Base64编码原理
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...
- Base64编码知识详解
在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...
- delphi Base64编码/解码及数据压缩/解压知识
一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...
- Base64 编码知识,一文打尽!
现在网站为了提升用户的浏览体验越来越多的使用了图片,而这些图片通常以 Base64 的形式存储和加载.因此各位开发工程师肯定对 Base64 毫不陌生了,那么你知道 Base64 究竟是什么,为什么要 ...
- 【字符编码】字符编码 && Base64编码算法
一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...
- 浅谈Base64编码算法
一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...
- 编码之Base64编码
Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法.目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一. 为什么会有 Base64 编码呢?因为有些网 ...
- 《PHP 实现 Base64 编码/解码》笔记
前言 早在去年 11 月底就已经看过<PHP 实现 Base64 编码/解码>这篇文章了,由于当时所掌握的位运算知识过于薄弱,所以就算是看过几遍也是囫囵吞枣一般,不出几日便忘记了其滋味. ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
随机推荐
- 对象序列化为何要定义serialVersionUID的来龙去脉
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象 ...
- 出去html中的标签
C#写法 public static string StripHTML(string strHtml) { string strOutput = strHtml; Regex regex = new ...
- spring security 注解@EnableGlobalMethodSecurity详解
1.Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解 ...
- pip修改国内源
Linux在~/.pip/pip.conf文件中添加或修改, windows不存在该目录,在当前用户目录下创建pip.ini(例如 C:\Users\bin\pip\pip.ini): [global ...
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
引自:http://blog.csdn.net/sinat_26917383/article/details/72861152 中文文档:http://keras-cn.readthedocs.io/ ...
- hbase源码带注释版本,放在这里,方便大家下载吧
看了5个月的hbase源码,记录了一些笔记,如果有需要的朋友可以拿去. 里面总共包括几个主要的工程吧:hbase-common,hbase-client,hbase-prefix-tree,hbase ...
- 使用FineReport打造考试分析系统
本系统的优点: 1.报表内容丰富:系统中包含总分分析.小分分析.作答错因分析.试卷命题分析和各类用户报告单五类报表.涵盖学校须要的各项分析数据,并提供丰富的图表,使分析数据更直观表现. 2.操作灵活简 ...
- go channel例子
channel初步认识: package main import "fmt" import "time" func main() { c := make(cha ...
- 百度地图Api进阶教程-地图鼠标左右键操作实例和鼠标样式6.html
<!DOCTYPE html> <html> <head> <meta name="viewport" content="ini ...
- PCL中分割方法的介绍(3)
(3)上两篇介绍了关于欧几里德分割,条件分割,最小分割法等等还有之前就有用RANSAC法的分割方法,这一篇是关于区域生成的分割法, 区 域生长的基本 思想是: 将具有相似性的像素集合起来构成区域.首先 ...