第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用密鑰和 IV 從節(jié)點(diǎn)解密 AES 到 Golang Panic

使用密鑰和 IV 從節(jié)點(diǎn)解密 AES 到 Golang Panic

Go
波斯汪 2022-10-24 15:27:40
我在 node.js 中有以下代碼,使用 crypto-js 使用帶有密鑰和 IV 的 AES 加密密碼。const crypto = require('crypto-js');const cryptKey = 'b676eac8cf70442385dfd4bcfaa61b52';const createRandomIv = function () {    const keySize = 192 / 32;    const ivSize = 128 / 32;    const evp = crypto.algo.EvpKDF.create({ keySize: keySize + ivSize, hasher: crypto.algo.SHA1 }).compute(cryptKey);    const iv = crypto.lib.WordArray.create(evp.words.slice(keySize), ivSize * 4);    return iv.toString();};const encryptPassword = function (password) {    const iv = createRandomIv();    const hash = crypto.AES.encrypt(        password,        cryptKey, {            iv,            mode: crypto.mode.CTR        }    );    const base64 = crypto.enc.Base64.parse(hash.toString());    const eHex = base64.toString(crypto.enc.Hex);    return `${iv}:${eHex}`;};const decryptPassword = function (encryptedPwd) {    const split = encryptedPwd.split(':');    if (split.length < 2) return '';    const reb64 = crypto.enc.Hex.parse(split[1]);    const bytes = reb64.toString(crypto.enc.Base64);    const hash = crypto.AES.decrypt(bytes, cryptKey, {        iv: split[0],        mode: crypto.mode.CTR    });    const plain = hash.toString(crypto.enc.Utf8);    return plain;};這是來自節(jié)點(diǎn) js 的加密密碼。const encryptedPassword = encryptPassword("Stack Overflow");console.log(encryptedPassword);// 2db5c01b4825b6d4dd7a7b96f04f3bb5:53616c7465645f5f691671363cda1b9d05ee6bdd637e1e99bc3b29ef2ad7ec53并且已經(jīng)嘗試使用 golang 對其進(jìn)行解密,如下所示package mainimport (    "crypto/aes"    "crypto/cipher"    "fmt"    "strings")}但它恐慌如下。恐慌:cipher.NewCBCDecrypter:IV 長度必須等于塊大小 goroutine 1 [運(yùn)行]:crypto/cipher.NewCBCDecrypter({0x10c4ee8, 0xc000066060}, {0xc00001e040, 0x1, 0x20})
查看完整描述

1 回答

?
qq_笑_17

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個贊

在 CryptoJS 代碼中,第二個參數(shù) incrypto.AES.encrypt()作為字符串傳遞,因此它被解釋為密碼短語。

因此,在加密期間,首先創(chuàng)建一個 8 字節(jié)的 salt,然后使用 KDF 導(dǎo)出密碼短語、密鑰和 IV EVP_BytesToKey()。

createRandomIv()使用并顯式傳入的 IV將crypto.AES.encrypt()被忽略!

hash.ToString() 以 OpenSSL 格式返回結(jié)果,該格式由前綴Salted__后跟 salt 和實(shí)際密文組成,均采用 Base64 編碼。eHex包含相同的數(shù)據(jù),但十六進(jìn)制而不是 Base64 編碼。

CryptoJS 不會自動禁用 CTR 等流密碼模式的填充,因此使用 PKCS#7 填充數(shù)據(jù),盡管這對于 CTR 不是必需的。


在 Go 代碼中,必須首先刪除不需要的 IV。從剩余的數(shù)據(jù)中,確定鹽和密文。

從 salt 和 passphrase 中,可以使用 檢索密鑰和 IV evp.BytesToKeyAES256CBCMD5()

使用密鑰和 IV 可以使用 AES-CTR 進(jìn)行解密。

最后,必須刪除 PKCS#7 填充。

下面的 Go 代碼實(shí)現(xiàn)了這些步驟。輸入數(shù)據(jù)是使用 NodeJS 代碼生成的:

import (

    "crypto/aes"

    "crypto/cipher"

    "encoding/hex"

    "fmt"

    "strings"


    "github.com/walkert/go-evp"

)


func main() {


    // Determine salt and actual ciphertext

    encryptedPwd := "2db5c01b4825b6d4dd7a7b96f04f3bb5:53616c7465645f5f66cbd1d539b6e51d45efded11e2211fa5e02278855dc86145d4e4891b0e25df9df96fb97a10a9f444f4519f2da4c69c430c5cbf3e9803a1f"

    split := strings.Split(encryptedPwd, ":")

    saltCiphertext, _ := hex.DecodeString(split[1])

    salt := saltCiphertext[8:16]

    ciphertext := saltCiphertext[16:]


    // Get key and IV

    key, iv := evp.BytesToKeyAES256CBCMD5([]byte(salt), []byte("b676eac8cf70442385dfd4bcfaa61b52"))


    // Decrypt

    block, _ := aes.NewCipher(key)

    plaintext := make([]byte, len(ciphertext))

    stream := cipher.NewCTR(block, iv)

    stream.XORKeyStream(plaintext, ciphertext)


    // Unpad

    unpaddedPlaintext := PKCS7Unpad(plaintext)


    fmt.Println("Decrypted data: ", string(unpaddedPlaintext)) // Decrypted data:  The quick brown fox jumps over the lazy dog

}


func PKCS7Unpad(src []byte) []byte {

    length := len(src)

    unpadding := int(src[length-1])

    return src[:(length - unpadding)]

}

關(guān)于安全性:

CryptoJS 執(zhí)行的密鑰和 IV 的派生在EVP_BytesToKey()今天被認(rèn)為是不安全的。

更安全的替代方法是將第二個參數(shù)作為 傳遞WordArray,以便將其解釋為密鑰并直接使用。

對于每個加密,必須生成一個隨機(jī) IV。

可選地,可靠的密鑰派生(例如 PBKDF2)可以與為每個加密隨機(jī)生成的鹽結(jié)合使用。

IV 和 salt(都不是秘密)將與密文連接。

最好用GCM代替CTR作為密文,這樣可以驗(yàn)證密文的真實(shí)性。


查看完整回答
反對 回復(fù) 2022-10-24
  • 1 回答
  • 0 關(guān)注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號