首页 > 解决方案 > 如何在 javascript 中翻译 Go des 代码

问题描述

我想用 javascript 翻译 Go DES 代码

这是我的 Go 代码,使用 des zeropadding 进行加密。现在想用javascript来得到同样的功能,但是试了很多次,结果总是错。

package zeropadding

import (
    "crypto/cipher"
    "crypto/des"
    "encoding/hex"
    "fmt"
    "strings"
)

func main() {
    text := DesEncrypt([]byte("12345678"), []byte("12345678"))
    fmt.Println(strings.ToUpper(hex.EncodeToString(text)))
}

func DesEncrypt(origData, key []byte) []byte {
    iv := []byte{0, 0, 0, 0, 0, 0, 0, 0}
    block, err := des.NewCipher(key)
    if err != nil {
        return nil
    }
    origData = ZeroPadding(origData)
    blockMode := cipher.NewCBCEncrypter(block, iv)
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted
}

func ZeroPadding(in []byte) []byte {
    length := len(in)

    blockCount := length / 8
    out := make([]byte, (blockCount+1)*8)
    var i int
    for i = 0; i < length; i++ {
        out[i] = in[i]
    }
    return out
}

如何使用javascript来做到这一点

const CryptoJS = require('./crypto-js.min')

function encryptByDES(message, key, iv) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var ivHex = CryptoJS.enc.Utf8.parse(iv);
    encrypted = CryptoJS.DES.encrypt(message, keyHex, {
            iv: ivHex,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.ZeroPadding
        }
    );
    return encrypted.ciphertext.toString();
}

console.log(encryptByDES("12345678", "12345678", 0))

我使用 lib crypto-js,使用 modeCryptoJS.mode.CBC和 padding CryptoJS.pad.ZeroPadding,但结果不等于 Go 代码输出。

标签: javascriptgodes

解决方案


看起来你的 go 代码和你的 javascript 都存在问题,这可能会让人感到困惑。(警告 - 我远不是加密专家!)。

零填充应该将 []byte 填充为块大小的倍数(在您的情况下为 8),但如果输入为 8 字节长,您将填充到 16 字节。尝试:

blockCount := (length - 1) / blockSize

操场

Javascript

您将 IV 作为数字提供,然后将其转换为 utf8。让我们镜像你在 go 中所做的事情:

var ivHex = CryptoJS.enc.Hex.parse(iv);

并将 IV 作为十六进制传递:

console.log(encryptByDES("1234567890", "12345678", "0000000000000000"))

Js小提琴


推荐阅读