【问题标题】:How to encrypt whole file using AES-256 encryption?如何使用 AES-256 加密对整个文件进行加密?
【发布时间】:2019-04-30 13:20:21
【问题描述】:

我的捆绑包中有一个 SQL 数据库文件。我需要使用 AES-256 加密该文件,并且需要将此数据写入另一个文件。

我已经尝试过使用 RNCryptor 和 CryptoSwift,但是,我要为我的问题找到准确的解决方案。

【问题讨论】:

    标签: ios swift sqlite encryption aes


    【解决方案1】:

    只需将任何文件读取为DataNSData 实例并对其应用加密并使用自定义扩展名回写即可。您可以使用@Ashish Rana 或https://gist.github.com/hfossli/7165dc023a10046e2322b0ce74c596f8 建议的lib

    1. 从文件加载数据 guard let fileURL = Bundle.main.url(forResource: "file-to-be-encrypted", withExtension: "txt") else { return } guard let fileData = try? Data(contentsOf: fileURL) else { return }

    2. 应用加密 let encrypted = try aes.encrypt(digest)

    3. 保存加密文件 try encrypted.write(to: encURL)

    如果您不想共享加密文件而只想保护它,那么您可以使用此处提到的操作系统基础加密:https://www.tomsguide.com/us/how-to-encrypt-ios,news-18338.html

    【讨论】:

    • 我需要分享这个文件。
    【解决方案2】:

    同时使用AES256CrypterRijndael,我得到了AES-256 加密和解密。

    从此链接添加代码:https://github.com/superk589/RijndaelSwift

    class StringCipher {
    
        static func Encrypt(plainText : String,  passPhrase : String) -> String {
    
            var result = ""
            let salt = AES256Crypter.randomSalt()
            let iv = AES256Crypter.randomSalt()
    
            let saltByte = [UInt8](salt)
            let ivByte = [UInt8](iv)
            do {
                let key = try AES256Crypter.createKey(password: passPhrase.data(using: .utf8)!, salt: salt)
                let r = Rijndael(key: key, mode: .cbc)!
                let decryptedData = r.encrypt(data: plainText.trimmed().data(using: .utf8)!, blockSize: 32, iv: iv)
                let dataBypte = [UInt8](decryptedData!)
                let mainByte = saltByte + ivByte + dataBypte
               // print(mainByte.count)
    
                let plainData = Data(bytes: mainByte)
                result = (plainData.base64EncodedString())
               // print(result)
            }
            catch {
                print("Failed")
                print(error)
            }
            return result
        }
        static func Decrypt( cipherText : String,  passPhrase : String) -> String {
    
            var result = ""
    
            do {
                let bData = cipherText.data(using: .utf8)!
                if let nsData = NSData(base64Encoded: cipherText, options: .ignoreUnknownCharacters) {
                    let bytes = [UInt8](nsData as Data)
                   // print(bytes, String(bytes: bytes, encoding: .utf8))
                   // print(bytes.count)
                    let subArray1 = bytes[0...31]
                    let subArray2 = bytes[32...63]
                    let subArray3 = bytes[64...(bytes.count-1)]
    
                    let saltData = Data(bytes: subArray1)
                    let ivData = Data(bytes: subArray2)
                    let plainData = Data(bytes: subArray3)
    
                   /*
                    print("salt === \(saltData.base64EncodedString())\n\n")
                    print("IV === \(ivData.base64EncodedString())\n\n")
                    print("Data === \(plainData.base64EncodedString())\n\n")
                    */
    
                    let key = try AES256Crypter.createKey(password: passPhrase.data(using: .utf8)!, salt: saltData)
                    print(key.count)
    
                    let r = Rijndael(key: key, mode: .cbc)!
    
                    let decryptedData = r.decrypt(data: plainData, blockSize: 32, iv: ivData)
                  //  print("Original: \(String(decoding: decryptedData!, as: UTF8.self))")
                    result = (String(decoding: decryptedData!, as: UTF8.self)).trimmed()
    
                }
    
            } catch {
                print("Failed")
                print(error)
            }
            return result
        }
    }
    
    

    【讨论】:

    • 不要推荐非标准的加密算法。 RIJNDAEL 不是 AES。它是 AES 比赛的候选人和获胜者。当 AES 标准化时,它与 RIJNDAEL 有所不同。 RIJNDAEL 可以有 128+32*k 位的块大小,而 AES 只有 128 位。 MCRYPT_RIJNDAEL_256 的块大小为 256 位,因此与 AES 不兼容。
    猜你喜欢
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多