在某些考虑数据安全的场景下,我们常常会用到加密解密、编码解码知识。比如把用户密码保存到数据库上,常用的方式是通过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. 基于HTML5功能强大的滑块幻灯片

    分享一款功能强大的HTML5滑块幻灯片.这是一款基于jQuery+HTML5实现的图片切换幻灯片代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <section cla ...

  2. XXE漏洞初窥

    前言: XXE Injection即XML External Entity Injection也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进⾏行处理时引发的安全问题. XML相关名词科 ...

  3. WCF终结点——终结点地址(EndpointAddress)

    终结点的地址的Uri属性作为终结点地址的唯一标示. 包括客户端终结点和服务端终结点. 一.服务端终结点: 服务端的终结点通过宿主的添加方法暴露出来,从而成为可以调用的资源. 下面是将服务绑定到宿主的代 ...

  4. thinkphp前台模版字符串截取

    ThinkPHP\Common\extend.php 中管理前台模版的截取{$vons.title|msubstr=0,26} 原始的代码是无法使用截取支持…. 由于涉及到只有汉字检测最为准确 需要加 ...

  5. 采用dlopen、dlsym、dlclose dlopen dlerror加载动态链接库【总结】

    .前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统调 ...

  6. Python 类的多继承

    #类的多继承 ''' 与c++不同,python的类经过优化,多继承时不会产生方法二义性 ''' #python中所有的类都是默认继承于object类 class A(object): def tes ...

  7. 自然语言交流系统 phxnet团队 创新实训 项目博客 (九)

    项目技术总结: VoiceToText的具体使用方法: 语音转文本部分是调用的科大讯飞的在线语音,它的激发方式是按键,通过按钮触发开启安卓设备的录音,此部分需要在源码中写入关于安卓权限的要求,来调用安 ...

  8. github开源库(三)

    41.android-swipelistview SwipeListView是一个Android List View实现,实现了自定义ListView单元格,可通过滑动来显示扩展面板.开发者可直接登陆 ...

  9. MYSQL查询前30条数据

    , LIMIT 接受一个或两个数字参数. 参数必须是一个整数常量. 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目. 初始记录行的偏移量是 (而不是 )

  10. Python之cv2

    1.读取图片 import cv2 img = cv2.imread('./test.jpg') 读取出来的图片是numpy.ndarray格式,值是0-255, img的形状是 (图片高度,图片宽度 ...