【问题标题】:Member 'CBC' takes no arguments成员“CBC”不接受任何参数
【发布时间】:2017-12-12 06:49:37
【问题描述】:

我正在集成 CryptoSwift 并发现此错误“成员 'CBC' 没有参数”。

我是这样调用函数的

let enc = try! AES(key: key, blockMode: .CBC(iv: iv)).encrypt(self.arrayOfBytes())

【问题讨论】:

  • 您能告诉我们变量是如何初始化的以及您使用的是哪个版本的 Swift 和 CryptoSwift?
  • 我正在使用 Swift 3.2 和 CryptoSwift 0.7.0
  • 最好避免使用 CryptoSwift,除此之外,它比基于 Common Crypto 的实现慢 500 到 1000 倍。 Apple 的 Common Crypto 已通过 FIPS 认证,因此经过了严格的审查,使用 CryptoSwift 在正确性和安全性(例如定时和功率攻击)方面是有机会的。

标签: swift cryptography cryptoswift


【解决方案1】:

对不起,我来晚了,但在运行pod update 后遇到了这个问题。我和你做的一样,我的项目在更新后中断了,因为新的 API 引入了不向后兼容的更改。为了回答您的问题,现在 CBC 不是 BlockMode 枚举的成员,因此使用新 API 编写等效代码的正确方法是:

let enc = try! AES(key: key, blockMode: CBC(iv: iv)).encrypt(self.arrayOfBytes())

【讨论】:

    【解决方案2】:

    如果您是 looking at the CryptoSwift API for version 3,您将获得以下 AES 初始化程序:

    public init(key: Array<UInt8>, iv: Array<UInt8>? = nil, blockMode: BlockMode = .CBC, padding: Padding = PKCS7()) throws {
    

    如您所见,iv 不是 CBC 的参数——它应该是——而是分组密码本身的参数。你应该升级到 Swift 4 或者你应该坚持旧的 API。

    【讨论】:

      【解决方案3】:

      对于 Swift 3.2,您应该检查正确的 README 以了解 API 的使用情况,因为 API 会随着时间发生变化。

      这里是 Swift 3.2(swift32 分支)的 README: https://github.com/krzyzanowskim/CryptoSwift/tree/swift32#aes-advanced-usage

      要回答这个问题,这是满足您需求的正确形式:

      try AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-20
        • 2014-03-16
        • 2020-02-23
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        • 2020-07-29
        相关资源
        最近更新 更多