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

Golang 解密使用 Node.js 加密的字符串

Golang 解密使用 Node.js 加密的字符串

Go
aluckdog 2021-11-15 20:46:45
我有一个内部应用程序的一堆密码,这些密码用 node.js 加密并(不相关地)存储在 mongodb 中。我想将此应用程序转换为 Go,但我对 node.js 加密感到困惑。我已经为此浏览了 node.js 源代码,它使用的是 OpenSSL evpBytesToKey 方法。我在网上找到了一个 Golang 实现,但我仍然无法在 Go 中解密用 node.js 加密的密码。“算法”是"aes256"this.encrypt = function(s){var cipher = crypto.createCipher(algo, key);var i = 0;var encrypted = "";while (i < s.length){    var end = Math.min(s.length-i, 15);    var chunk = s.substring(i, end+i);    encrypted += cipher.update(chunk, "utf8", "base64");    i+= end;}encrypted += cipher.final("base64");encrypted = encrypted.replace(/\//g,"_").replace(/\+/g, "-"); // base64 url encodereturn encrypted;}和 Go 代码:func evpBytesToKey(password string, keyLen int) (key []byte, iv []byte) {const md5Len = 16cnt := (keyLen-1)/md5Len + 1m := make([]byte, cnt*md5Len)key = make([]byte, keyLen)iv = make([]byte, md5Len)copy(m, md5sum([]byte(password)))// Repeatedly call md5 until bytes generated is enough.// Each call to md5 uses data: prev md5 sum + password.d := make([]byte, md5Len+len(password))start := 0for i := 1; i < cnt; i++ {    start += md5Len    copy(d, m[start-md5Len:start])    copy(d[md5Len:], password)    copy(m[start:], md5sum(d))}return m[:keyLen], iv}和解密功能func Decrypt(key string, b64 string) string {text := decodeBase64(b64)   // base64.StdEncoding.DecodeString helper methodblock, err := aes.NewCipher(evpBytesToKey(key,32))if err != nil {    panic(err)}if len(text) < aes.BlockSize {    panic("ciphertext too short")}iv := text[:aes.BlockSize]text = text[aes.BlockSize:]fmt.Println(iv)fmt.Println(text)cfb := cipher.NewCFBDecrypter(block, iv)cfb.XORKeyStream(text, text)return string(text)}以下是一些示例数据:8PTcrR0Nf0sltmdtvLUrFg== (你告诉我它解密的内容:)关键是var key = "random array of characters"; 字面意思。这超出了我个人的加密经验和培训。这是我最后的障碍...感谢您提供的任何帮助和指导。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

在 OpenSSL 中,“aes256”相当于“aes-256-cbc”。所以你的使用NewCFBDecrypter似乎关闭了。除此之外,IV/密钥生成需要稍微调整以实际生成IV。

这个测试脚本给了我一个至少是 ASCII 的输出。

http://play.golang.org/p/zsPMd8QN0b

我通过让 OpenSSL 为我生成它找到了要查找的 IV / 密钥(使调试genIvAndKey更容易一些)。

请注意,您仍然需要确定在实际密码和填充之间拆分的位置。(unicode.IsPrint?)


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信