2015-12-08 133 views
2

我使用CryptoSwift加密一些數據,然後使用Node.js加密相同的數據。但結果不一樣。我問作者,他說這不是一個錯誤。CryptoSwift加密的數據與Node.js不同

我不知道我犯了什麼錯誤。下面是我如何應用CryptoSwift和Node.js的圖片:

密碼算法:AES-256-CFB

鍵:32個字節1

IV:16個字節0

CryptoSwift:開發分枝0.1.1

的Node.js:LTS 4.2.3

Data encrypted by CryptoSwift

Data encrypted by Node.js 4.2.3

這裏是SWIFT代碼:

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> 

可以看到,前兩個字節是相同的,但其餘的都沒有。爲什麼?我的代碼寫錯了嗎?我對密碼不太瞭解,請告訴我原因。非常感謝。

+0

如果您關心性能或安全性,請勿使用CryptoSwift。 CryptoSwift比Common Crypto慢500到1000倍,並且沒有經過良好的審查或認證。 – zaph

+0

你爲什麼使用CFB模式,一般情況是使用CBC模式。 – zaph

+0

只是測試代碼,不介意:) – Neko

回答

0

除非數據是數據塊大小(16字節)的倍數,並且數據大小爲雙方先驗知道以滿足要求填充是必需的。通常使用的填充是PKCS#7(PKCS#5基本相同)。

在代碼中沒有指定填充因此塊的平衡將是無論是在緩衝區中的垃圾還是算法可能 null填充它,它總是最好不依靠非標準的默認值。請參閱SO Answer關於使用Common Crypto的示例。

但最好的辦法是使用RNCryptor進行加密,它可用於多種語言和平臺。它還處理使加密安全的所有位。它經過了充分的審查和積極開發。

+0

謝謝,我會盡力解決它。 :) – Neko

+0

這裏是新的問題:https://github.com/krzyzanowskim/CryptoSwift/issues/175,請問爲什麼數據不一樣? – Neko

+0

我正在使用RNCryptor,並且似乎得到非常慢的解密速度,例如5-10秒來解密像400個簡單的字符串。 –

1

回答這個問題。

你的代碼的NodeJS加密[0x5的,0x77,0x5的,爲0x0,0x3,0x89上,爲0x20],但你的CryptoSwift碼加密[0x5的,0x77]→[0x5的,爲0x0,0x3,0x89上,爲0x20。這就是爲什麼你會得到不同的結果。

+0

@Neko哇,我沒有看好代碼。您不能僅從單獨的加密連接加密的字節。歐洲央行可能全面阻止,但即使這是思維破碎。 Marcin:+1 – zaph