当前位置: 首页 > 编程日记 > 正文

iOS AES加密

AES 美国国家安全局采用的加密方法,MAC 系统自带的钥匙串也是采用的AES 加密方法

有两种模式

CBC 模式 链式加密 ,密码块链,使用一个秘钥和一个初始化向量,对数据执行加密。

ECB 电子密码本方法加密,数据拆分成块,独立加密。

mac 系统已经集成openssl 工具,可以直接文本进行加密

1 打开终端 桌面新建一个文件夹,cd 到里面,touch一个abc.txt

2 openssl enc -des-ecb -K 616263 -nosalt -in abc.txt -out msg1.bin

enc 代表加密

-des-ecb 代表ecb 模式

-k 代表 key 值

-nosalt 代表不加盐

-in abc.txt 代表 读取里面内容

-out msg1.bin 代表输出为msg1.bin 二进制文件

3 xxd 查看二进制文件

xxd msg1.bin

AES是开发中常用的加密算法之一。然而由于前后端开发使用的语言不统一,导致经常出现前端加密而后端不能解密的情况出现。然而无论什么语言系统,AES的算法总是相同的, 因此导致结果不一致的原因在于 加密设置的参数不一致 。于是先来看看在两个平台使用AES加密时需要统一的几个参数。

密钥长度(Key Size)
加密模式(Cipher Mode)
填充方式(Padding)
初始向量(Initialization Vector)

密钥长度

AES算法下,key的长度有三种:128、192和256 bits。由于历史原因,JDK默认只支持不大于128 bits的密钥,而128 bits的key已能够满足商用安全需求。因此本例先使用AES-128。(Java使用大于128 bits的key方法在文末提及)

加密模式

AES属于块加密(Block Cipher),块加密中有CBC、ECB、CTR、OFB、CFB等几种工作模式。本例统一使用CBC模式。

填充方式

由于块加密只能对特定长度的数据块进行加密,因此CBC、ECB模式需要在最后一数据块加密前进行数据填充。(CFB,OFB和CTR模式由于与key进行加密操作的是上一块加密后的密文,因此不需要对最后一段明文进行填充)

在iOS SDK中提供了PKCS7Padding,而JDK则提供了PKCS5Padding。原则上PKCS5Padding限制了填充的Block Size为8 bytes,而Java实际上当块大于该值时,其PKCS5Padding与PKCS7Padding是相等的:每需要填充χ个字节,填充的值就是χ。

初始向量

使用除ECB以外的其他加密模式均需要传入一个初始向量,其大小与Block Size相等(AES的Block Size为128 bits),而两个平台的API文档均指明当不传入初始向量时,系统将默认使用一个全0的初始向量。

引入NSString+Encryption.h" 文件

CocoaSecurity 框架基本实现了所有的加密方式

#import "ViewController.h"#import "NSString+Encryption.h"
#import "CocoaSecurity.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.[self aesecbMode];}/**AES CBC 模式加密的使用CocoaSecurity 是一个用于加解密的框架,封装了各种加密方法的使用,用此框架来校验NSString+Encryption.h 加解密结果是否一样CocoaSecurity 框架,解密的时候传入的参数都是16进制*/- (void)aescbcMode{NSString *plainText = @"你好";
// key 16字节的字符串,就等于128 bite
// key支持 128 192 256 bite,分别对象 16 24 32 长度单位
// 如果长度错误,就会跑出异常NSString *key128 = @"0123456789ABCDEF";// 16进制字符串NSString *key128Hex = @"30313233343536373839414243444546";NSString *iv = @"0123456789ABCDEF";// 16进制字符串NSString *ivHex = @"30313233343536373839414243444546";CocoaSecurityResult *result = [CocoaSecurity aesEncrypt:plainText hexKey:key128Hex hexIv:ivHex];NSString *aesBase64 = [plainText aesEncryptWithKey:key128 iv:iv];NSData *aesData = [plainText aesEncryptWithDataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding] dataIv:[iv dataUsingEncoding:NSUTF8StringEncoding]];NSLog(@"SecurityResult加密:\r\n%@ --- %@",result.base64,result.hexLower);NSLog(@"NSString+Encryption加密:\r\n%@ --- %@",aesBase64,aesData);// 解密NSString *decryptStr = [aesBase64 aesBase64StringDecryptWithHexKey:key128Hex hexIv:ivHex];NSData *data = [NSString aesDecryptWithData:aesData dataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding] dataIv:[iv dataUsingEncoding:NSUTF8StringEncoding]];// 使用CocoaSecurity 和 封装的方法 加解密结果进行校验NSLog(@"解密:%@ --- %@",decryptStr, [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);}/**AES EBC 模式加解密,EBC 模式*/- (void)aesecbMode{NSString *plainText = @"123";NSString *key128 = @"0123456789ABCDEF";// key 16进制形式NSString *key128Hex = @"30313233343536373839414243444546";NSString *aesBase64 = [plainText aesECBEncryptWithKey:key128];NSData *aesData = [plainText aesECBEncryptWithDataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding]];NSLog(@"加密:%@ --- %@",aesBase64, aesData);// 解密NSString *decStr = [aesBase64 aesECBBase64StringDecryptWithHexKey:key128Hex];NSData *decData = [NSString aesECBDecryptWithData:aesData withDataKey:[key128 dataUsingEncoding:NSUTF8StringEncoding]];NSLog(@"解密:%@---%@",decStr, [[NSString alloc]initWithData:decData encoding:NSUTF8StringEncoding]);}/**AEC  框架是<CommonCrypto/CommonCrypto.h>加解密所用的同一个核心方法@param option 加密还是解密 枚举类型 kCCEncrypt 加密  kCCDecrypt 解密@param kCCAlgorithmAES128 加密算法 默认是AES@param mode kCCOptionPKCS7Padding 为CBC 加密 默认是CBC 加密kCCOptionPKCS7Padding  | kCCOptionECBMode 为ECB 加密@param bytes] 加密秘钥@param length] 秘钥长度@param bytes] IV 初始化向量@param bytes] 加密的数据@param length] 数据的长度@param buffer 密文缓冲区@param bufferSize 缓冲区的大小@param encryptedSize@return 加密的结果*/
//    CCCryptorStatus cryptStatus = CCCrypt(option,
//                                          kCCAlgorithmAES128,
//                                          mode,
//                                          [key bytes],     // Key
//                                          [key length],    // kCCKeySizeAES
//                                          [iv bytes],      // IV
//                                          [data bytes],
//                                          [data length],
//                                          buffer,
//                                          bufferSize,
//                                          &encryptedSize);@end

相关文章:

(转)Unity中武器与人物的碰撞检测

自&#xff1a;http://blog.csdn.net/Monzart7an/article/details/24435843 目前来说有三种思路&#xff0c;其实前两种算变种了&#xff1a; 1、动画关键帧回调 范围检测。 这个是在Asset store上面下的一个例子中看到的&#xff0c;其实之前在做端游时&#xff0c;也差不多是…

CentOS Linux解决 Device eth0 does not seem to be present

通过OVF部署Linux主机后提示 ringing up interface eth0: Device eth0 does not seem to be present,delaying initialization. 解决办法&#xff1a; 首先&#xff0c;打开/etc/udev/rules.d/70-persistent-net.rules内容如下面例子所示&#xff1a; # vi /etc/udev/rules.d/…

meteor从入门到精通_我已经大规模运行Meteor一年了。 这就是我所学到的。

meteor从入门到精通by Elie Steinbock埃莉斯坦博克(Elie Steinbock) 我已经大规模运行Meteor一年了。 这就是我所学到的。 (I’ve been running Meteor at scale for a year now. Here’s what I’ve learned.) A year ago I wrote an article describing my first experience…

使用javascript开发2048

嗯&#xff0c;团队队友开发了一个简单的2048...哈哈&#xff0c;没办法&#xff0c;这游戏那么疯狂&#xff0c;必须搞搞啦&#xff0c;大家能够直接粘贴代码到一个html文件&#xff0c;直接执行就可以 依赖文件&#xff1a;jquery&#xff0c;假设乜有&#xff0c;大家能够自…

html 自动弹出框

1.点击div外部隐藏&#xff0c; //*代表tip_box所包含的子元素 $(body).click(function(e) {var target $(e.target);if(!target.is(#tip_box *) ) {//事件处理} });2.div动态展开 .tip_box{width:300px;height:0;border-radius:3px;background-color:#fff;overflow:hidden;bo…

3-runtime 之 Tagged Pointer

Tagged Pointer 是自从iPhone 5s 之后引入的特性 1 先说一下iOS的内存布局 代码区&#xff1a;存放编译之后的代码数据段 &#xff1a;字符串常量 &#xff1a; NSString *hello “hello”;已经初始化和未初始化的全局变量&#xff0c;静态变量堆&#xff1a;通过alloc&#…

编程术语_伟大的编程术语烘烤

编程术语by Preethi Kasireddy通过Preethi Kasireddy 伟大的编程术语烘烤 (The Great Programming Jargon Bake-off) Imperative vs. Declarative. Pure vs. Impure. Static vs. Dynamic.命令式与声明式。 纯与不纯。 静态与动态。 Terminology like this is sprinkled throu…

Swift 圆环进度条

Swift 圆环进度条 import UICircularProgressRing import UIKit import UICircularProgressRing class ViewController: UIViewController {var progress:UICircularProgressRing!;override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading …

Linux文件系统构成(第二版)

Linux文件系统构成/boot目录&#xff1a;内核文件、系统自举程序文件保存位置,存放了系统当前的内核【一般128M即可】如:引导文件grub的配置文件等/etc目录&#xff1a;系统常用的配置文件&#xff0c;所以备份系统时一定要备份此目录如&#xff1a;系统管理员经常需要修改的文…

include_once 问题

最近在做微信小程序&#xff0c;在include_once 微信文件后&#xff0c;该方法return 前面会用特殊字符&#xff0c;导致我return 给前端的本来是json串变成了字符 解决方法 &#xff1a; ob_clean(); return json_encode(array);转载于:https://www.cnblogs.com/zouzhe0/p/630…

babel6 babel7_当您已经准备好Babel时设置Flow

babel6 babel7by Jamie Kyle杰米凯尔(Jamie Kyle) 当您已经准备好Babel时设置Flow (Setting up Flow when you’ve already got Babel in place) Flow is a static type checker for JavaScript. It makes you more productive by providing feedback as you write code. Flow…

如何为Android上的产品设计一款合适的图标

如 果你已经完成了你的app&#xff0c;你一定会马上向其它人宣布这件事情。但是你需要注意一个很重要的问题&#xff0c;那就是app的图标。你的图标可能在项目启动之 前就已经设计好了&#xff0c;但我不喜欢这样&#xff0c;如果app没有完成实际上图标也没什么用了。如果你不是…

得到windows聚焦图片(windows 10)

有些Windows聚焦图片确实很漂亮&#xff0c;很希望保留下来&#xff0c;但是Windows聚焦图片总更好&#xff0c;网上有得到聚焦图片的方法&#xff0c;每次都手动去弄真麻烦&#xff0c;于是自己编了一个小程序&#xff0c;自动得到Windows聚焦图片&#xff0c;下面是运行这个小…

swift 加载gif 框架图片

swift 加载gif 框架图片 SwiftGifOrigin 以下代码 轻松搞定 let imgView UIImageView(frame: CGRect(x: 50, y: 100, width: 280, height: 200));imgView.loadGif(name: "gfff");self.view.addSubview(imgView);

devops_最低可行DevOps

devopsby Michael Shilman通过迈克尔希尔曼(Michael Shilman) 最低可行DevOps (Minimum Viable DevOps) 快速而肮脏的指南&#xff0c;用于扩展您的发布并拥抱互联网的死亡 (A quick and dirty guide to scaling your launch and embracing the Internet hug of death) Startu…

java基础之——类的初始化顺序(转载)

原文地址&#xff1a;http://www.cnblogs.com/chrischennx/p/3612295.html 由浅入深&#xff0c;首先&#xff0c;我们来看一下&#xff0c;一个类初始化有关的都有些啥米&#xff1a; 静态成员变量、静态代码块、普通成员变量、普通代码块、构造器。&#xff08;成员方法&…

如何用CSS快速布局(一)—— 布局元素详细

要快速进行网页排版布局&#xff0c;则必须对布局的元素有清晰的了解&#xff0c;才不会总是在细节处出错。这一篇先详解有关布局的因素作为布局基础&#xff1a;块级元素and内联元素、盒模型、准确定位、元素对齐、样式继承。下一篇则重点描述快速布局思路。 一、什么是块级元…

iOS 改变字符串中数字的颜色

匹配中文字符 [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内) [^\x00-\xff] 匹配网址&#xff1a;[a-zA-z]://[^\s]* 匹配国内电话 \d{3}-\d{8}|\d{4}-\{7,8} 匹配腾讯QQ号 [1-9][0-9]{4,} 匹配18位身份证号^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$ Swift String…

jpg在线合并jpg_JPG如何运作

jpg在线合并jpgby Colt McAnlis通过Colt McAnlis JPG如何运作 (How JPG Works) The JPG file format was one of the most technologically impressive advancements to image compression to come on the scene in 1992. Since then, it’s been a dominant force in represe…

革命就是请客吃饭(案例分析吧)

前不久路过南京, 拜会了本科同学. 刚好他要见个青年才俊谈些事情, 于是就神神秘秘地把我拉了过去. 一路高谈阔论, 指点江山, 忆往昔峥嵘岁月之后, 此次"拜访"的目的也渐渐清晰起来. 我们所要见的人是位年轻的创业者, 他有些移动互联网的点子, 想和我们分享下, 并尝试…

TextView-- 测量文字宽度

https://my.oschina.net/lengwei/blog/637380; http://blog.csdn.net/mare_blue/article/details/51388403; http://blog.csdn.net/baidu_31093133/article/details/52413893; --1,Android中调用Paint的measureText()方法取得字符串显示的宽度值: public static float GetTextW…

swift 简单风格的Toaster

简单风格的Toaster Toaster //1 弹出文本 "Hello World" 延迟时间 2 展示时间 1 Toast(text: "Hello World", delay: 2, duration: 1).show();//2 初始化toast 方法 let toast Toast(text: "你好世界"); toast.show(); toast.cancel();// 3 …

工业革命前数千年人口经济_我们已经进行了数千年的编程

工业革命前数千年人口经济by Tautvilas Mečinskas由TautvilasMečinskas 我们已经进行了数千年的编程 (We have been programming for thousands of years) Computer programs are all around us. We interact with them every day. It looks as if software is becoming mor…

1-flutter 安装步骤

flutter 安装步骤 1 下载SDK SDK 下载地址 2 解压压缩包 将sdk 文件夹丢进系统的应用程序&#xff08;Application&#xff09;的目录 3 配置环境变量 命令行 open ~/.bash_profile &#xff0c;然后在bash 文件中写入下面配置 export PATH$PATH:/Applications/flutter/bi…

codevs1258 关路灯(☆区间dp)

1258 关路灯 时间限制: 1 s空间限制: 128000 KB题目等级 : 大师 Master题目描述 Description多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。 多瑞卡每晚到早晨5点钟都在晚会上&#xff0c;然后他开始关灯。开…

BroadcastReceiver自学笔记

1. 使用步骤&#xff1a; 1.1 声明Intent Intent intent new Intent("name");------静态常用 IntentFilter filter new IntentFilter("name");--------动态常用 1.2 注册 1.3 接收&#xff1a;利用action或者Bundle 在OnReceive()中&#xff0c;接收信息…

小狗钱钱_小狗设计

小狗钱钱by Patryk Adaś通过PatrykAdaś 小狗设计 (Design for doggies) Education should be universal and free for everyone.教育应该是普及的&#xff0c;对所有人来说都是免费的。 When I first entered the field, designers were patient with me. They gave me fee…

层化(stratification)的方法

有时候我们会遇到调整后的模型反而不如调整前表现好的情况&#xff0c;这可能和数据的随机分割有关系。在这个不平衡的数据情况下&#xff0c;最好用层化&#xff08;stratification&#xff09;的方法&#xff0c;比如&#xff1a; from sklearn.cross_validation import Stra…

零基础入门jQuery视频教程

零基础入门jQuery最新版开发.NET富客户端应用(选择器、DOM操作、事件和动画、Ajax应用、插件、Mobile)课程分类&#xff1a;.NETJquery适合人群&#xff1a;初级课时数量&#xff1a;35课时用到技术&#xff1a;javascript,ajax,jquery,handler涉及项目&#xff1a;各知识点的项…

2-flutter 之HelloWorld

widget 在flutter 中&#xff0c;几乎所有的东西都是widget&#xff0c;本身是用户界面的基本构建快&#xff0c;将widget组成一个层次结构&#xff0c; 调用widget树。每一个窗口widget都嵌套在父窗口widget中&#xff0c;并且从其父窗口中继承属性。甚至应用程序对象本身也…