加密算法(扩展知识: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从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
随机推荐
- java中日期的换算处理
JAVA8中的日期API是JSR-310的实现,并且是工作在ISO-8601日历系统基础上的,但我们也可以在非ISO的日历上.JDK8的日期API大致分为以下几个包: java.time包:JDK8中 ...
- Android NFC近场通信2——NFC标签调度
上面一篇文章简单介绍了NFC的背景和技术应用,今天主要是讲解一下NFC如何发起通信和标签通信(主要是翻译android官网的资料,中间加入个人心得). NFC总是在一个发起者和一个被动目标之间发生.发 ...
- [uboot]uboot中显示logo
http://blog.chinaunix.net/uid-20543672-id-3246292.html
- elasticsearch6.4 memory locking requested for elasticsearch process but memory is not locked
[2018-10-18T05:28:57,713][ERROR][o.e.b.Bootstrap ] [node-45] node validation exception[1] bootstrap ...
- CLR、内存分配和垃圾回收
一.CLR CLR:即公共语言运行时(Common Language Runtime),是中间语言(IL)的运行时环境,负责将编译生成的MSIL编译成计算机可以识别的机器码,负责资源管理(内存分配和垃 ...
- FatJar in 创新实训 自然语言交流系统
Fat Jar Eclipse Plug-In是一个可以将Eclipse JavaProject的所有资源打包进一个可执行jar文件的小工具,可以方便的完成各种打包任务,我们经常会来打jar包,但是e ...
- Java 之 File
11.3 I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程 ...
- 关于Unity中的3D拾取
3D拾取 3D游戏实际上看到的是2D画面,我们在屏幕上点击,想要找到哪个3D物体,我们实际上是在一个2维平面内做3D拾取. 3D拾取实际上是,当玩家点击屏幕的时候,会从显示屏幕的摄像头发射一条射线,射 ...
- 苹果Mac OS系统修改Hosts文件的方法
使用苹果Mac OS X系统的用户有很多,近期也有不少童鞋问我Mac怎么修改hosts,修改hosts的方式有很多,下面我就整理两种比较方便的方法吧,希望能够帮到大家. 在某些时候可能遇到了需要修改系 ...
- Linux C++ 访问子目录以及里面的文件
#include <iostream> #include <fstream> #include <string> #include <vector> # ...