首先,「apple」不能成爲AES-256的關鍵。這不夠長。 AES-256密鑰必須完全是256位(32字節)。 「蘋果」在編碼它的可能方式中,5.因此,這裏已經存在問題。系統可能會爲你填充零,但你不能依賴它。這不是AES密鑰應該看起來像什麼;他們需要32個「有效的隨機」字節; 「蘋果」不是「有效的隨機」。
nodejs包指示它生成隨機IV。這可能意味着它也編碼的隨機IV的輸出,並期望它在輸入,果然,這就是我們在代碼中看到:
ciphertext = Buffer.concat([iv, ciphertext, cipher.final()]);
假設PHP頁面下面的源代碼,實際上與該工具,那麼他們已經叫這個:
$this->setIV("");
這可能轉化成某處16個字節的零(這是一個非常不安全的IV)。
較短的答案是應用AES或編碼輸出絕對沒有標準。你發現絕大多數的實現(包括這兩個)都是非常不安全的,因爲他們假設你知道如何添加它們缺失的所有片斷。例如,這兩個實現都需要一個HMAC,因爲他們使用CBC模式,但都不包含其中一個,如果你想把一個像「apple」這樣的字符串作爲密碼,你需要一個像PBKDF2這樣的密鑰派生函數來將它轉換爲關鍵。 (這就是你如何將「apple」這樣的字符串轉換爲「有效隨機」的字符串。)任何安全實現都將與任何其他安全實現不兼容。沒有廣泛使用的標準格式也是安全的。
所有這一切說,一個安全的格式應該總是導致兩個加密有不同的結果密文。 nodejs包通過包含隨機IV來正確執行此操作,並且如果多次運行它,您將得到不同的結果。這是防止某些類型攻擊的功能。所以有不同的結果應該不會令人驚訝。
如果您正在尋找包含所需所有部件的現成AES格式,請查看RNCryptor或libsodium。
我不是專家,但我認爲它與初始化向量有關。 – noisypixy