菜鸟教程小白 发表于 2022-12-11 19:25:09

ios - swift 3.1 中的 DES/ECB/NoPadding 使用 Common Crypto


                                            <p><p>我想在我的 iOS 应用程序中使用 DES 加密和解密字符串(是的,我知道 DES 不再安全,但应用程序接收消息并将消息发送到使用它的 BLE 模块)。
我成功地为 Common Crypto 创建了一个桥接头,我找到了这个用于加密并将其修改为 DES 和 swift 3 <a href="https://stackoverflow.com/questions/29222642/asynchronous-encryption-in-swift/29230965#29230965" rel="noreferrer noopener nofollow">Asynchronous encryption in Swift</a>:</p>

<pre><code>func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -&gt; NSData? {

    let keyBytes = keyData.bytes.assumingMemoryBound(to: UInt8.self)
    print(&#34;keyLength   = \(keyData.length), keyData   = \(keyData)&#34;)

    let ivBytes = ivData.bytes.assumingMemoryBound(to: UInt8.self)
    print(&#34;ivLength    = \(ivData.length), ivData    = \(ivData)&#34;)

    let dataLength = Int(data.length)

    let dataBytes = data.bytes.assumingMemoryBound(to: UInt8.self)
    print(&#34;dataLength= \(dataLength), data      = \(data)&#34;)

    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,
                              &amp;numBytesEncrypted)

    return cryptData;
}
</code></pre>

<p>函数调用和参数:</p>

<pre><code>override func viewDidLoad() {
    super.viewDidLoad()

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

    let key = Data.init(bytes: )
    let keyData = NSData.init(data: key)

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

    print(&#34;data: \(data)&#34;)
    if let encryptedData = testCrypt(data: data!, keyData:keyData, ivData: ivData!, operation:UInt32(kCCEncrypt)) {
      print(&#34;encryptedData: \(encryptedData)&#34;)
      if let decryptedData = testCrypt(data: encryptedData, keyData:keyData, ivData: ivData!, operation:UInt32(kCCDecrypt)) {
            let dec = Data.init(referencing: decryptedData)
            print(&#34;decryptedData: \(decryptedData))&#34;)
      }
    }
}
</code></pre>

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

<p>加密数据:<6081ada9 0487c0a5 35e542bd e9600861 4250a693 65573337 39df5525 66c40cd8 b358bf6a d9837f9c 00000000 00000000 00000000 0000></p>

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

<p>为什么解密只返回部分正确的结果?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>所以似乎没有可用的 NoPadding 选项,最后我只是从 'cryptData' 初始化中删除了 '+ kCCBlockSizeDES' 并在我的字符串中添加了 '0' 字符,然后再加密它以达到正确的大小(例如长度8) 的倍数,然后在解密后我只是删除了零以获得原始字符串。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - swift 3.1 中的 DES/ECB/NoPadding 使用 Common Crypto,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43200983/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43200983/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - swift 3.1 中的 DES/ECB/NoPadding 使用 Common Crypto