javascript - 如何在 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 代码输出。
解决方案
看起来你的 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"))
推荐阅读
- c# - 随机方法返回两个不重复的值
- reactjs - “typeof LogoAvatar”类型的参数不可分配给“ComponentType”类型的参数
- scala - 使用另一列中的键查找 MapType 列中的值
- inno-setup - Inno Setup 如何从 AfterInstall 中排除单个文件
- java - Java - 带有 FadeIn 和 FadeOut 动画的无休止的 while 循环
- r - 使用 read.csv 和 read.csv2 读取同一文件时属性数据类型和值的差异
- reactjs - 命名空间“React”没有导出成员“ConsumerProps”、ProviderProps
- javascript - 在 Next.js 中链接到动态路由
- android - 使用布尔值共享首选项
- jenkins - 自动化 Jenkins Pipeline 以多次运行