IOS加密技术之——3DES加密解密技术(记录)

IOS常用加密技术有三种:3DES、SHA1和MD5。其中,对称加密技术有:3DES和SHA1;非对称加密技术有:MD5;

对称加密:加密解密用的是同一个密钥。

非对称加密:生成公有密钥和私有密钥。一个加密,一个解密。

本篇介绍的是3DES加密解密技术:

1、创建HeaderFile文件My3DES.h。然后,添加以下代码,引用相关的头文件:

#import <CommonCrypto/CommonCrypto.h>

2、在BuildSetting面板中设置Objective-C Bridging Header的Value值为第1步创建的桥接文件所在的位置。比如:项目名/文件名.h。

3、配置好了之后,下面就开始使用了。

import UIKit

class ViewController: UIViewController {

    private let randomStringArray:[Character] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".map({$0});
    
    var key:String!;
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let data:Data = encrypt(encryptData: "http://www.baidu.com");
        decrypt(inputData: data);
    }

    func randomStringOfLength(_ length:Int) -> String {
        var string = "";
        for _ in(1...length) {
            string.append(randomStringArray[Int(arc4random_uniform(UInt32(randomStringArray.count) - 1))]);
        }
        return string;
    }
    
    //加密
    func encrypt(encryptData:String) -> Data {
        key = randomStringOfLength(kCCKeySize3DES);
        let inputData:Data = encryptData.data(using: String.Encoding.utf8)!;
        
        let keyData:Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!;
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes);
        let keyLength = size_t(kCCKeySize3DES);
        
        let dataLength = Int(inputData.count);
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes);
        let bufferData = NSMutableData(length: Int(dataLength) + kCCKeySize3DES)!;
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes);
        let bufferLength = size_t(bufferData.length);
        var bytesDecrypted = Int(0);
        
        let cryptStatus = CCCrypt(
            UInt32(kCCEncrypt),
            UInt32(kCCAlgorithm3DES),
            UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &bytesDecrypted
            );
        
        if Int32(cryptStatus) == Int32(kCCSuccess) {
            bufferData.length = bytesDecrypted;
            print("encrypt success");
            
        } else {
            print("加密过程出错\(cryptStatus)");
        }
        return bufferData as Data;
    }
    
    //解密
    func decrypt(inputData:Data) {
        let keyData:Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!;
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes);
        let keyLength = size_t(kCCKeySize3DES);
        
        let dataLength = Int(inputData.count);
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes);
        let bufferData = NSMutableData(length: Int(dataLength) + kCCKeySize3DES)!;
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes);
        let bufferLength = size_t(bufferData.length);
        var bytesDecrypted = Int(0);
        
        let cryptStatus = CCCrypt(
            UInt32(kCCDecrypt),
            UInt32(kCCAlgorithm3DES),
            UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &bytesDecrypted
        );
        
        if Int32(cryptStatus) == Int32(kCCSuccess) {
            bufferData.length = bytesDecrypted;
            let clearDataAsString = NSString(data: bufferData as Data, encoding: String.Encoding.utf8.rawValue);
            print("解密后的内容:\(clearDataAsString! as String)");
        } else {
            print("解密过程出错\(cryptStatus)");
        }
    }

}

输出结果为:

encrypt success
解密后的内容:http://www.baidu.com

猜你喜欢

转载自blog.csdn.net/lpCrazyBoy/article/details/88661109
今日推荐