1 回答

TA貢獻1772條經驗 獲得超5個贊
cypherText
如果明文的大?。槺阏f一下,這是一個誤導性術語)不是塊大?。ˋES 為 16 字節)的整數倍,則Go 代碼會填充 0x30 值。使用密碼 ( ) 的 SHA256 值的前 16 個字節的十六進制編碼的 UTF-8 編碼作為密鑰word
。密文是十六進制編碼的。
在線工具解密失敗,因為在線工具使用PKCS#7 padding,密文是Base64解碼的。為了能夠解密,必須禁用默認的 PKCS#7 填充并且必須對密文進行十六進制解碼,請參見CyberChef。
使用 JavaScript 代碼解密失敗,因為 CryptoJS 默認使用 PKCS#7 填充,密鑰被十六進制解碼,并且密文未作為CipherParams
對象傳遞。為了能夠解密,必須禁用默認的 PKCS#7 填充,密鑰必須采用 UTF-8 編碼,并且密文必須作為CipherParams
對象傳遞:
var password = 'день';
var key = CryptoJS.SHA256(password).toString();
key = key.substring(0, key.length/2);
var ciphertext = '46ef70c1193fa29024595964a0eb0157c4e6602da6c1429f8a2b81146f79e798'
var decrypted = CryptoJS.AES.decrypt(
{ciphertext: CryptoJS.enc.Hex.parse(ciphertext)}, // Fix 1: pass a CipherParams object
CryptoJS.enc.Utf8.parse(key), // Fix2: UTF-8 encode the key
{ mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding }); // Fix 3: disable padding
console.log(decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
給出解密后的 UTF-8 解碼數據:деньBvFGlrXeWCnPTwFC00000000
。
安全性:ECB 不使用 IV,因此不安全。如今,應用了經過身份驗證的加密(例如 GCM),但至少是一種帶有 IV 的模式(例如 CBC)。
此外,使用摘要作為密鑰派生函數 (KDF) 是不安全的。為此有專門的功能(例如 Argon2 或 PBKDF2)。另外,應該直接使用KDF的字節串,而不是hex編碼的UTF-8編碼,這樣會降低安全性。
應用的 0x30 填充通常是不可靠的。更可靠的是例如 PKCS#7 填充。
- 1 回答
- 0 關注
- 395 瀏覽
添加回答
舉報