亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在golang中編碼字符串aes-128 ecb并在js中解密

在golang中編碼字符串aes-128 ecb并在js中解密

Go
皈依舞 2022-12-26 11:17:21
我正在嘗試在 golang 服務器上加密字符串,我有一個 aes-128 加密實用程序func EncryptAES(key []byte, plaintext string) (string, error) {    // create cipher    c, err := aes.NewCipher(key)    if err != nil {        return "", err    }    // allocate space for ciphered data    out := make([]byte, len(plaintext))    for i := 1; i <= len(plaintext)/16; i++ {        tempBuf := make([]byte, 16)        offset := (i - 1) * 16        limit := offset + 16        // encrypt        c.Encrypt(tempBuf, []byte(plaintext[offset:limit]))        for j := 0; j < len(tempBuf); j++ {            out[offset+j] = tempBuf[j]        }    }    // return hex string    return hex.EncodeToString(out), nil}在那之后我正在嘗試做類似的事情    hasher := sha256.New()    hasher.Write([]byte(word))    sha := hasher.Sum(nil)    cypherText := word + userSessionKey    for len([]byte(cypherText))%16 != 0 {        cypherText += "0"    }    sha128 := sha[:len(sha)/2]    captchaKey, err := utils.EncryptAES([]byte(hex.EncodeToString(sha128)), cypherText)    if err != nil {        SendErrorResponse(ctx, fasthttp.StatusInternalServerError, []byte("error generating aes session key "+err.Error()))        return    }但是對于這個密鑰和密文,我在加密/解密 aes 網站上收到這個錯誤用于解碼的 js func 也不起作用async function decryptAES128(key, cipherText){    let hash = CryptoJS.SHA256(key).toString();    hash = hash.substring(0, hash.length/2);    console.log(hash);    console.log(cipherText)    const bytes = await CryptoJS.AES.decrypt(CryptoJS.enc.Hex.parse(cipherText), CryptoJS.enc.Hex.parse(hash), { mode: CryptoJS.mode.ECB });    return CryptoJS.enc.Utf8.stringify(bytes.words)}什么都不打印
查看完整描述

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 填充。


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 395 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號