2

我使用 CryptoSwift 加密一些数据,然后使用 Node.js 加密相同的数据。但结果并不相同。我问过作者,他说不是bug。

我不知道我在哪里做错了。以下是我如何使用 CryptoSwift 和 Node.js 的图片:

密码算法:aes-256-cfb

密钥:32 字节 1

iv: 16 字节 0

CryptoSwift:开发分支 0.1.1

Node.js:LTS 4.2.3

CryptoSwift 加密的数据

Node.js 4.2.3 加密的数据

这是快速代码:

    func testAES() {
    let key = [UInt8](count: 32, repeatedValue: 1)
    let iv = [UInt8](count: 16, repeatedValue: 0)
    print(key)
    print(iv)

    let aes256cfb = try! AES(key: key, iv: iv, blockMode: .CFB)

    let en1 = try! aes256cfb.encrypt([0x5, 0x77], padding: nil)
    print(en1.map({ i in String(format: "%2x", i)}))

    let en2 = try! aes256cfb.encrypt([0x5, 0x0, 0x3, 0x89, 0x20], padding: nil)
    print(en2.map({ i in String(format: "%2x", i)}))
}

CryptoSwift: 
["77", "ef"]
["77", "98", "c9", "2c", "45"]

Node.js: 
<Buffer 77 ef>
<Buffer cf a5 66 8a 3e>

你可以看到,前两个字节是一样的,但其余的不是。为什么?我的代码写错了吗?我对加密了解不多,请告诉我原因。太感谢了。

4

2 回答 2

1

要回答这个问题。

您的 NodeJS 代码加密 [0x5, 0x77, 0x5, 0x0, 0x3, 0x89, 0x20],但您的 CryptoSwift 代码加密 [0x5, 0x77] 然后 [0x5, 0x0, 0x3, 0x89, 0x20]。这就是为什么你会得到不同的结果。

于 2015-12-12T22:35:59.493 回答
0

除非数据是块大小(16 字节)的倍数,并且双方先验地知道数据大小,否则需要填充。一般使用的填充是PKCS#7(PKCS#5基本相同)。

在代码中没有指定填充,因此块的平衡将是缓冲区中的任何垃圾,或者算法可能会填充它,最好不要依赖非标准默认值。

有关使用 Common Crypto 的示例,请参阅SO Answer 。

但最好的办法是使用RNCryptor进行加密,它适用于多种语言和平台。它还处理使加密安全的所有位。它经过严格审查并正在积极开发中。

于 2015-12-08T01:45:50.250 回答