Node.js、Python和Go解密結果差異:為何Node.js解密AES-128-ECB失敗?

Node.js、Python和Go解密結果差異:為何Node.js解密AES-128-ECB失敗?

Node.JSpython和Go AES-128-ECB解密結果差異及原因剖析

本文分析了使用Node.js、Python和Go三種編程語言實現AES-128-ECB解密算法時,輸出結果存在差異的原因。三種語言的代碼目標一致——解密相同加密數據,但Node.js的解密結果與Python和Go的結果不符,Python和Go成功解密,而Node.js解密失敗。 這主要源于代碼實現細節和數據處理方式的差異。

問題核心在于Node.js代碼的解密結果錯誤。Python使用了cryptography庫,Go使用了內置的crypto/aes包,而Node.js使用了crypto.createDecipheriv函數(注意:原文中提到的createchipheriv為拼寫錯誤,應為createDecipheriv)。

Node.js代碼中,關鍵錯誤在于數據處理:

立即學習Python免費學習筆記(深入)”;

const x = ibuf.slice(8);

這段代碼僅截取了ibuf緩沖區從第8個字節開始的數據。然而,正確的做法是根據totalsize變量(表示加密數據大小)來確定需要解密的數據長度。ibuf緩沖區可能包含額外頭部信息,因此必須根據totalsize截取正確的數據進行解密,而不是簡單地從第8個字節開始。 這導致Node.js代碼僅解密部分數據,從而產生錯誤結果。

此外,原文已明確指出createDecipheriv函數本身使用正確,之前的createchipheriv拼寫錯誤是錯誤的,會導致解密失敗。 提供的補充示例代碼驗證了crypto.createDecipheriv和crypto.createCipheriv在Node.js環境下的正確用法,以及Buffer對象的正確操作方法。 該示例代碼中,加密和解密均正常工作,證明Node.js的crypto庫本身沒有問題。

因此,問題的根源在于Node.js代碼對數據的錯誤處理,而非算法本身或庫的錯誤。 如果Node.js代碼能夠正確處理數據并使用正確的函數,其解密結果將與Python和Go的結果一致。

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享