加密

作者: T92 | 来源:发表于2016-10-28 11:04 被阅读39次

    swift加密可以使用MD5,base64,AES,SHA。

    一、MD5

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。
      MD5算法主要用在用户注册口令的加密,对于普通强度的口令加密,可以通过以下三种方式进行破解:
    (1)在线查询密码。一些在线的MD5值查询网站提供MD5密码值的查询,输入MD5密码值后,如果在数据库中存在,那么可以很快获取其密码值。
    (2)使用MD5破解工具。网络上有许多针对MD5破解的专用软件,通过设置字典来进行破解。
    (3)通过社会工程学来获取或者重新设置用户的口令。
    因此简单的MD5加密是没有办法达到绝对的安全的,因为普通的MD5加密有多种暴力破解方式,因此如果想要保证信息系统或者网站的安全,需要对MD5进行改造,增强其安全性
    使用步骤:
    1.导入第三方库MD5

    MD5

    2.桥接文件

    MD5

    3.实现

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var contentTextField: UITextField!
        
        @IBOutlet weak var beforLabel: UILabel!
        
        @IBOutlet weak var afterLabel: UILabel!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
        }
    
        //单次:只加密一次,是MD5中最简单的加密方式,可以通过特殊途径破解(MD5破解工具,MD5官网字典解密)
        @IBAction func onceDM5(sender: UIButton) {
            
            if isEmpty(self.contentTextField.text!) == false{
                //散列算法
                //let result = (self.contentTextField.text! as NSString).stringFromMD5()
                //哈希
                let result2 = (self.contentTextField.text! as NSString).MD5Hash()
                
                showResult(result2)
            }
        }
        
        //二次:进行两次加密
        @IBAction func twiceMD5(sender: UIButton) {
            if isEmpty(self.contentTextField.text!) == false{
                //散列算法
                let result = (self.contentTextField.text! as NSString).stringFromMD5()
                let result2 = result.stringFromMD5()
                
                showResult(result2)
            }
        }
        
        //加盐:拼接自己的key值
        @IBAction func withKeyMD5(sender: UIButton) {
            
            if isEmpty(self.contentTextField.text!) == false{
                
                //拼接
                let newstr = self.contentTextField.text! + "CD1605"
                //加密
                let result = (newstr as NSString).stringFromMD5()
                showResult(result)
            }
            
        }
        
        //加密乱序:现对指定字符串加密,然后打乱字符串中字符顺序,MD5中最复杂的加密方式
        @IBAction func MD5withRank(sender: UIButton) {
            
            if isEmpty(self.contentTextField.text!) == false{
                //加密  
                let result = (self.contentTextField.text! as NSString).stringFromMD5()
                //乱序
                //从开始向后取多少位
                let subStr1 = (result as NSString).substringToIndex(6)
                //从指定位置渠道结尾
                let subStr2 = (result as NSString).substringFromIndex(7)
                let newStr = subStr2 + subStr1
                
                showResult(newStr)
            }
        }
        
        func isEmpty(str:String) -> Bool{
            if self.contentTextField.text == ""{
                return true
            }
            return false
        }
        
        func showResult(reslt:String){
            self.beforLabel.text = String(format: "加密前:%@", self.contentTextField.text!)
            self.afterLabel.text = String(format: "加密后:%@", reslt)
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            self.view.endEditing(true)
        }
    }
    

    二、base64

    1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符.

      1. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了.
      2. 解码原理:将4个字节转换成3个字节.先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位.这样就还原了.

      Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的ASCII字符序列,常用在需用通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下。Base64并不是一种用于安全领域的加密解密算法(这类算法有DES等),尽管我们有时也听到使用Base64来加密解密的说法,但这里所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其变换是非常简单的,仅仅能够避免信息被直接识别

    使用步骤:
    1.导入第三方库
    2.创建桥接文件并包含
    3.解决问题,由于Base64使用的不是ARC内存管理机制,所以系统会报错,报错如下

    不是使用arc错误

    解决方法

    不是使用arc错误解决

    4.实现

    import UIKit
    
    //base64使用的是0-9,a-z或A-Z进行拼接的字符串,严格来说,Base64属于编解码的方式,仅仅是为了字符串不能被直接识别
    //编码原理:将3个字节转换成4个字节,将二进制转换成ASCII字符序列
    //解码原理:将4个字节转换成3个字节
    
    class ViewController: UIViewController {
    
        let str = "username=二狗子&pass=123456"
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            //系统Base64编解码
            //ios7之后才提出
            originnalBase64()
            
            //第三方Base64编解码
            thirdBase64()
            
        }
    
        func originnalBase64() {
            
            //转化为nsdata
            let data = str.dataUsingEncoding(NSUTF8StringEncoding)
            //加密
            let result1 = data?.base64EncodedDataWithOptions([])
            print("系统编码结果:\(result1!)")
            
            //解密
            //将编码结果转为nsdata
            let data1 = NSData(base64EncodedData: result1!, options: [])
            //转为字符串
            let result2 = NSString(data: data1!, encoding: NSUTF8StringEncoding)
            print("系统解码结果:\(result2!)")
        }
        
        func thirdBase64() {
            
            //编码
            let result1 = Base64.encodeBase64String(str)
            print("第三方编码结果:\(result1!)")
            let result2 = Base64.decodeBase64String(result1)
            print("第三方解码结果:\(result2!)")
        }
    }
    

    三、AES

    AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据
      AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES 使用了几种不同的技术来实现置换和替换

    使用步骤:
    1.导入第三方库
    2.桥接

    #import "SecurityUtil.h"
    #import "Base64.h" //在AES解密的时候需要用base64编码
    

    3.实现

    import UIKit
    
    class ViewController: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let str = "user=铁蛋&pass=123456"
            
            //方式1
            //加密
            let result1 = SecurityUtil.encodeBase64String(str)
            print(result1)
            //解密
            let result2 = SecurityUtil.decodeBase64String(result1)
            print(result2)
            
            //方式2
            //加密
            let result3 = SecurityUtil.encryptAESData(str, app_key: "CDios1605")
            print(result3)
            //解密
            //首先使用base64进行编码
            let data = GTMBase64.decodeString(result3)
            //解密
            let result4 = SecurityUtil.decryptAESData(data, app_key: "CDios1605")
            print(result4)
        }
    }
    

    四、SHA加密

    SHA又叫做安全哈希算法,主要适用于数字签名标准里面定义的数字签名算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程
      该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
    通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

    相关文章

      网友评论

          本文标题:加密

          本文链接:https://www.haomeiwen.com/subject/yiteuttx.html