为了账号安全,请及时绑定邮箱和手机立即绑定

在高俚语中加密 AES/CBC,在角度加密中解密JS

在高俚语中加密 AES/CBC,在角度加密中解密JS

Go
红糖糍粑 2022-09-12 20:46:30
我正在尝试在 Go 中加密数据,并使用带有 PKCS7 填充的 AES CBC 模式以角度方式对其进行解密。但是当我尝试解密Angular中的数据时,它没有返回任何内容转到代码:package mainimport (    "bytes"    "crypto/aes"    "crypto/cipher"    "crypto/rand"    "encoding/base64"    "fmt"    "io")func main() {    secret := []byte("28cEVB4BUE7GKNwjuRhN3szK5E3!&q*y")    data := []byte("Test")    encResult, err := Encrypt(data, secret)    fmt.Println("encResult", encResult)    fmt.Println("enc err", err)    //  encrypted := "U2FsdGVkX1+LU7rE47VtIDwGIOsJa05BzOmAzQfdbVk="    result, err := Dncrypt(encResult, secret)    fmt.Println("decrypted result", result)    fmt.Println("decryption err", err)}/*CBC encryption Follow the example code of the golang standard libraryBut there is no padding inside, so make up*/// Use PKCS7 to fill, IOS is also 7func PKCS7Padding(ciphertext []byte, blockSize int) []byte {    padding := blockSize - len(ciphertext)%blockSize    padtext := bytes.Repeat([]byte{byte(padding)}, padding)    return append(ciphertext, padtext...)}func PKCS7UnPadding(origData []byte) []byte {    length := len(origData)    unpadding := int(origData[length-1])    return origData[:(length - unpadding)]}//aes encryption, filling the 16 bits of the key key, 24, 32 respectively corresponding to AES-128, AES-192, or AES-256.func AesCBCEncrypt(rawData, key []byte) ([]byte, error) {    block, err := aes.NewCipher(key)    if err != nil {        panic(err)    }    //fill the original    blockSize := block.BlockSize()    rawData = PKCS7Padding(rawData, blockSize)    // Initial vector IV must be unique, but does not need to be kept secret    cipherText := make([]byte, blockSize+len(rawData))    //block size 16    iv := cipherText[:blockSize]    fmt.Println("iv", iv)    if _, err := io.ReadFull(rand.Reader, iv); err != nil {        panic(err)    }    //block size and initial vector size must be the same    mode := cipher.NewCBCEncrypter(block, iv)    mode.CryptBlocks(cipherText[blockSize:], rawData)    return cipherText, nil}我从加密JS解密方法中得到一个空响应。对于加密JS,iv的值应该是多少?
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

Go 代码生成一个随机 IV,并在 CBC 模式下使用 AES-256 执行加密,并带有 PKCS7 填充。IV 与密文 连接,结果是 Base64 编码。密钥是通过 Utf8 编码从给定字符串生成的。IV|ciphertext


请注意,Go 代码


if _, err := io.ReadFull(rand.Reader, iv); err != nil {

    panic(err)

}

使用随机值初始化 IV。因此,IV的输出应该在之后。由于它是在发布代码中打印的,因此显示零IV,但与使用的IV不对应。

顺便说一句,对于解密,显式输出不是必需的,因为如前所述,代码连接IV和密文。


在加密JS代码中,使用零IV,可能是因为Go代码中的输出不正确。相反,IV和密文必须分开。

此外,密钥作为字符串传递。这是不正确的,因为 CryptoJS 将字符串解释为密码并执行基于密码的密钥派生。相反,密钥必须作为 .

由于密钥是 Go 代码中 Utf8 编码的,因此必须应用 Utf8 编码器(另请参阅其他答案)。WordArray


CBC 和 PKCS7 填充是默认值,可以指定,但不需要指定。


以下加密 JS 代码中的密文是使用 Go 代码生成的:


// Separate IV and ciphertext

var data   = CryptoJS.enc.Base64.parse("WL7oDghTeEbjZ6QPeb/TGuDGijktQ4PZS7+wd0Ayu8Y="); // from Go code

var iv = CryptoJS.lib.WordArray.create(data.words.slice(0, 4));    // first 4 words = 16 bytes

var ct = CryptoJS.lib.WordArray.create(data.words.slice(4));       // rest


// Decrypt

var decrypted = CryptoJS.AES.decrypt(

    {ciphertext: ct},                                              // alternatively as Base64 encoded string

    CryptoJS.enc.Utf8.parse("28cEVB4BUE7GKNwjuRhN3szK5E3!&q*y"),   // Utf8 encode key string

    {iv:iv}

);


console.log("Decrypted: ", decrypted.toString(CryptoJS.enc.Utf8)); // Decrypted:  Test

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

并将密文正确解密为 。Test



查看完整回答
反对 回复 2022-09-12
?
墨色风雨

TA贡献1853条经验 获得超6个赞

试试这个,确保你使用相同的密钥进行加密和解密


//The get method is use for decrypt the value.

get(keys, value){

    var key = CryptoJS.enc.Utf8.parse(keys);

    var iv = CryptoJS.enc.Utf8.parse(keys);

    var decrypted = CryptoJS.AES.decrypt(value, key, {

        keySize: 128 / 8,

        iv: iv,

        mode: CryptoJS.mode.CBC,

        padding: CryptoJS.pad.Pkcs7

    });

    

    return decrypted.toString(CryptoJS.enc.Utf8);

}


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号