iOS 开发之路(AES/DES加密实现) 三
最近接触的这个项目由于以前服务器上用的是DES/CBC/PKCS5Padding加密方式,为了让在iOS上的加密结果与服务器端保持一致,我做了很多尝试,现在分享给大家。PS:现在不推荐用DES了,只是服务器端不能随便改,别的项目平台有依赖。
首先是在Swift中,建一个bridge-Header文件用来调用OC的方法,这一步还是蛮简单的。
贴上我的实现代码:
class CrypTools: NSObject {
internal func cryptoOperation() -> String {
// Validation checks.
let jm = "fjdkasljfkls"
let jmData = jm.data(using: String.Encoding.utf8)!
let key = "\n\u{0014}\u{001E}(2<FP" //这里是java端对应的key byte[]的字符串表现形式 btye[] key = {10, 20, 30, 40, 50, 60 ,70, 80}
var t:String = "" // Prepare data parameters
let keyData: Data! = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!
let keyBytes = keyData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> UnsafePointer<UInt8> in
return bytes
} //let keyBytes = keyData.bytes.bindMemory(to: Void.self, capacity: keyData.count)
let dataLength = Int(jmData.count)
let dataBytes = jmData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) -> UnsafePointer<UInt8> in
return bytes
} var bufferData = Data(count: Int(dataLength) + )
let bufferPointer = bufferData.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) -> UnsafeMutablePointer<UInt8> in
return bytes
}
let bufferLength = size_t(bufferData.count)
let ivStr = "\u{000B}\u{0016}!,7BMU" //这里是java端对应的iv变量字符串
let iv = ivStr.data(using: String.Encoding.utf8)!
let ivBuffer: UnsafePointer<UInt8>? = iv.withUnsafeBytes({ (bytes: UnsafePointer<UInt8>) -> UnsafePointer<UInt8> in
return bytes
})
var bytesDecrypted = Int()
// Perform operation
let cryptStatus = CCCrypt(
, // Operation 这里代表DES加密而非解密
, // Algorithm 这里代表DES算法(其他数字可以是别的算法,如AES),研究一下OC的自带的方法就行了
, // Options 这里代表PKCS7Padding
keyBytes, // key data
, // key length
ivBuffer, // IV buffer
dataBytes, // input data
dataLength, // input length
bufferPointer, // output buffer
bufferLength, // output buffer length
&bytesDecrypted) // output bytes decrypted real length
if Int32(cryptStatus) == Int32(kCCSuccess) {
bufferData.count = bytesDecrypted // Adjust buffer size to real bytes
print(bufferData)
let a = bufferData.withUnsafeBytes{
[UInt8](UnsafeBufferPointer(start: $, count: bufferData.count))
}
print(a)
t = bufferData.base64EncodedString()
}
return t
} }
可以看到cryptStatus下对应的几个参数我都做了注释,其中option那一栏1对应PKCS7Padding,实测这和服务器端的PKCS7Padding填充没有任何区别,之前没有得出一致的加密结果时我一直以为是这个填充参数的问题,但实际上是iv和key的设置问题(这是重点)
在java端iv和key多半以byte[] = {}来表示,我们要做的就是将这个byte[]转换成字符串,最后再将这个字符串放在iOS代码中(字符串可能要用Unicode编码表示)。
其实在Swift下,第三方库CryptoSwift非常好用,大家可以上GitHub上检索研究一下。只不过不支持老旧的DES加密,这里只是针对有DES加密需求的人给出解决方案。
iOS 开发之路(AES/DES加密实现) 三的更多相关文章
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- iOS开发UI篇—Quartz2D简单使用(三)
iOS开发UI篇—Quartz2D简单使用(三) 一.通过slider控制圆的缩放 1.实现过程 新建一个项目,新建一个继承自UIview的类,并和storyboard中自定义的view进行关联. 界 ...
- iOS开发中常用到的加密方式
1 base64 1.1 简介 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据 ...
- iOS开发之使用XMPPFramework实现即时通信(三)
你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...
- XE6 /XE8 & IOS开发之免证书真机调试三步走,生成iPA文件并安装到其它苹果设备上
XE6 & IOS开发之免证书真机调试(1):颁发属于自己的App签名证书(有图有真相) XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相) XE6 &a ...
- 在ios开发中有多少常用的加密解密方式(备用)
最常用的是MD5和base64编码,还有DES 3DES AES加密 ios怎么实现RAS加密解密 最近几天折腾了一下如何在iOS上使用RSA来加密.iOS上并没有直接的RSA加密API.但是iOS提 ...
- iOS 开发之路(WKWebView内嵌HTML5之图片上传) 五
HTML5页面的图片上传功能在iOS端的实现. 首先,页面上用的是plupload组件,在wkwebview上存在两个坑需要修复才能正常使用. 问题:在webview上点击选择照片/相机拍摄,就会出现 ...
- iOS 开发之路(使用WKWebView加载Html5) 四
基于Swift 3 . Xcode 8 . iOS 10 下的WKWebView的使用. 首先是WKWebView的基本用法: var wk:WKWebView! var progBar:UIProg ...
- iOS 开发之路(登陆页键盘遮挡输入框问题)一
在学习开发登陆页的时候,遇到的问题分享如下: 首先是swift 3.0 中,NotificationCenter 设置 selector 如下: @IBOutlet weak var bottomCo ...
随机推荐
- postgres配置主从流复制
postgres主从流复制 postgres在9.0之后引入了主从的流复制机制,所谓流复制,就是从库通过tcp流从主库中同步相应的数据.postgres的主从看过一个视频,大概效率为3w多事务qps. ...
- 绘制SVG内容到Canvas的HTML5应用
SVG与Canvas是HTML5上绘制图形应用的两种完全不同模式的技术,两种绘制图形方式各有优缺点,但两者并非水火不容,尤其是SVG内容可直接绘制在Canvas上的功能,使得两者可以完美的融合在一起, ...
- CSS魔法堂:不得不说的Containing Block
前言 <CSS魔法堂:重新认识Box Model.IFC.BFC和Collapsing margins>中提到在没有floated兄弟盒子时,line box的左右边框会与所属的cont ...
- MVC中Json的使用:Controller中Json的处理
一.当查询得到的数据符合前台要求,不需要做任何处理,直接DataList To Json 返回前台. 代码: , out recordCount); return Json(allEntities, ...
- IIS 架构解析
我们在使用ASP.NET平台做web开发的时候,经常会接触到IIS(Internet Information Services 互联网信息服务).这篇文章主要来介绍IIS7.0+的架构.IIS的安全脆 ...
- 【转载】8天学通MongoDB——第四天 索引操作
这些天项目改版,时间比较紧,博客也就没跟得上,还望大家见谅. 好,今天分享下mongodb中关于索引的基本操作,我们日常做开发都避免不了要对程序进行性能优化,而程序的操作无非就是CURD,通常我们 又 ...
- C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)
最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是.在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来 ...
- 获取 Chromium 源代码以及环境配置
一.获取代码 a) 不下载代码,直接浏览,到这里:http://src.chromium.org/viewvc/chrome/ 或者这里:http://code.google.com/p/chromi ...
- 【Java每日一题】20161104
package Nov2016; public class Ques1104 { private String num; public void setNum(String num){ num = n ...
- 【Linux_Fedora_应用系列】_5_如何安装XZ Utils 解压缩工具以及利用 xz工具来解压缩.xz文件
有段时间没有来园子了,今天从 www.kernel.org 上面下载了一个 2.6.32.2 内核压缩包,下载 下来后发现是一个 .xz 结尾的文件,一看与通常的 .gz..bz2等格式不一样, ...