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