专栏首页家劲iOS 开发之路(AES/DES加密实现) 三

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) + 8)
        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(0)
        // Perform operation
        let cryptStatus = CCCrypt(
            0,                  // Operation 这里代表DES加密而非解密
            1,    // Algorithm 这里代表DES算法(其他数字可以是别的算法,如AES),研究一下OC的自带的方法就行了
            1,                    // Options 这里代表PKCS7Padding
            keyBytes,                   // key data
            8,                  // 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: $0, 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加密需求的人给出解决方案。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS 开发之路(登陆验证调用WebService)二

        swift3.0下使用Alamofire调用Webservice遇到的一些问题以及解决方案。

    从今若
  • iOS 开发之路(登陆页键盘遮挡输入框问题)一

        首先是swift 3.0 中,NotificationCenter 设置 selector 如下:

    从今若
  • iOS 开发之路(使用WKWebView加载Html5) 四

      基于Swift 3 、 Xcode 8 、 iOS 10 下的WKWebView的使用。

    从今若
  • iOS微信特殊字符保护方案

    一般来说,特殊字符闪退是系统漏洞引起,只要更新系统就行。但大部分用户不愿意更新系统...

    微信终端开发团队
  • 前端基础:ECMAScript 6

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准。

    RendaZhang
  • Java|Spring Cloud Stream 体系及原理介绍

    Spring Cloud Stream 在 Spring Cloud 体系内用于构建高度可扩展的基于事件驱动的微服务,其目的是为了简化消息在 Spring Cl...

    heidsoft
  • Struts2【开发Action】

    前言 前面Struts博文基本把Struts的配置信息讲解完了…..本博文主要讲解Struts对数据的处理 Action开发的三种方式 在第一次我们写开发步骤的...

    Java3y
  • Android Studio 3.2升级后的编译问题解决办法

    2018年9月24日,Android Studio千呼万唤终于放出了3.2正式版,博主赶紧下载了安装包升级到最新版,每次AS升级都会带来各种各样的惊喜(大坑),...

    用户4464237
  • Linux养成计划(三)

    既然在虚拟机上面安装了CentOS操作系统,直接在虚拟机操作不就可以,为什么还需要远程登陆呢?在公司中每个程序员都有一个电脑,但是我们需要操作的Linux服务器...

    用户1093975
  • 从零开始写 PHP 扩展

    PHP 是用 C 语言写的。对于每个 PHPer 来说,都有着内心的一种希望写扩展的冲动了吧。然而,缺乏一个很好的切入点。Google 上搜 PHP 扩展开发,...

    程序员宝库

扫码关注云+社区

领取腾讯云代金券