2017-04-04 169 views
0

我想使用DES对我的iOS应用程序中的字符串进行加密和解密(是的,我知道DES不再安全,但应用程序接收并发送消息给BLE模块,使用它)。 我成功创建公共的密码一个桥接报头,我发现这个用于加密和适于它的DES和迅速3 Asynchronous encryption in Swift使用通用密码在swift 3.1中使用DES/ECB/NoPadding

func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? { 

    let keyBytes = keyData.bytes.assumingMemoryBound(to: UInt8.self) 
    print("keyLength = \(keyData.length), keyData = \(keyData)") 

    let ivBytes = ivData.bytes.assumingMemoryBound(to: UInt8.self) 
    print("ivLength = \(ivData.length), ivData = \(ivData)") 

    let dataLength = Int(data.length) 

    let dataBytes = data.bytes.assumingMemoryBound(to: UInt8.self) 
    print("dataLength = \(dataLength), data  = \(data)") 

    let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeDES) 

    let cryptPointer = cryptData.mutableBytes.assumingMemoryBound(to: UInt8.self) 
    let cryptLength = size_t(cryptData.length) 

    let keyLength    = size_t(kCCKeySizeDES) 
    let algoritm: CCAlgorithm = UInt32(kCCAlgorithmDES) 
    let options: CCOptions = UInt32(kCCOptionECBMode) 

    var numBytesEncrypted :size_t = 0 

    let cryptStatus = CCCrypt(operation, 
           algoritm, 
           options, 
           keyBytes, keyLength, 
           ivBytes, 
           dataBytes, dataLength, 
           cryptPointer, cryptLength, 
           &numBytesEncrypted) 

    return cryptData; 
} 

函数调用和参数:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let ivString = "Use a random iv!" 
    let ivData = (ivString as NSString).data(using: String.Encoding.utf8.rawValue) as NSData! 

    let key = Data.init(bytes: [0x23, 0x12, 0x4d, 0x89, 0x88, 0x34, 0xCf, 0x50]) 
    let keyData = NSData.init(data: key) 

    let message = "Don´t try to read this text. Top Secret Stuff" 
    let data = (message as NSString).data(using: String.Encoding.utf8.rawValue) as NSData! 

    print("data: \(data)") 
    if let encryptedData = testCrypt(data: data!, keyData:keyData, ivData: ivData!, operation:UInt32(kCCEncrypt)) { 
     print("encryptedData: \(encryptedData)") 
     if let decryptedData = testCrypt(data: encryptedData, keyData:keyData, ivData: ivData!, operation:UInt32(kCCDecrypt)) { 
      let dec = Data.init(referencing: decryptedData) 
      print("decryptedData: \(decryptedData))") 
     } 
    } 
} 

预期结果= < 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 70205365 2e20546f 63726574 20537475 6666>

的EncryptedData:< 6081ada9 0487c0a5 35e542bd e9600861 4250a693 655 73337 39df5525 66c40cd8 b358bf6a d9837f9c 00000000 00000000 00000000 0000>

decryptedData = < 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 e0456e88 3f896b9b 00000000 00000000 00000000 0000>

为什么解密只有部分返回一个正确的结果?

+0

代码从哪里来?你的输入数据,预期输出和实际输出是什么? “奇怪的结果”是什么意思? –

+0

@MartinR对不起,我更新了我的问题 – JamesRGNT

回答

0

所以看起来好像没有NoPadding选项可用,最后我刚刚从'cryptData'初始化中删除了'+ kCCBlockSizeDES',并在将字符串加密到正确的大小之前给我的字符串添加了'0'字符(例如a长度倍数为8),然后解密后,我只是删除零来获得原始字符串。