使用通用加密的 Swift 3.1 中的 DES/ECB/NoPadding

詹姆士RGNT

我想使用 DES 在我的 iOS 应用程序中加密和解密字符串(是的,我知道 DES 不再安全,但应用程序接收消息并将消息发送到使用它的 BLE 模块)。我成功地为 Common Crypto 创建了一个桥接标头,我发现它用于加密并将其改编为 DES 和Swift Swift 3异步加密

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 2e20546f 70205365 63726574 766>

加密数据:<6081ada9 0487c0a5 35e542bd e9600861 4250a693 65573337 39df5525 66c40cd8 b358bf6a d9837f9c 000000000000000000000000000

解密数据 = <446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 e049000000b0009b0000009e080000009e0000009

为什么解密只返回部分正确结果?

詹姆士RGNT

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章