node.js之如何在 nodejs 中使用加密 AES 进行加密

jackei 阅读:54 2025-06-02 22:19:02 评论:0

我们在 Go 中有一个加密机制。
输入类似于 key= "dHRzbGNvbnNlbnR0ZWNobQ=="和 text = "1234565434"。

  func encrypt(key []byte, text string) (string, error) {  
     block, err := aes.NewCipher(key) 
     if err != nil { 
        return "", err 
    } 
 
     msg := AddPadding([]byte(text)) 
     ciphertext := make([]byte, aes.BlockSize+len(msg)) 
     iv := ciphertext[:aes.BlockSize] 
     cfb := cipher.NewCFBEncrypter(block, iv) 
     cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(msg)) 
     finalMsg := removeBase64Padding(base64.URLEncoding.EncodeToString(ciphertext)) 
     return finalMsg, nil 
  } 
 
 
 func AddPadding(src []byte) []byte { 
      padding := aes.BlockSize - len(src)%aes.BlockSize 
      padtext := bytes.Repeat([]byte{byte(padding)}, padding) 
      return append(src, padtext...) 
 } 

输出为:“AAAAAAAAAAAAAAAAAAAAAEl8eI9S6j7mZTWG0vdwV1A="

我想在 NodeJS 中复制相同的内容。
     let iv = 'AAAAAAAAAAAAAAAA'; 
     let key = "dHRzbGNvbnNlbnR0ZWNobQ=="; 
 
     var cipher = crypto.createCipheriv('aes-256-cbc', keyBytes, iv); 
     cipher.update(src, 'binary', 'base64'); 
     let y = cipher.final('base64'); 
     console.log("y --->> ",y); 

但是我遇到了错误
   crypto.js:194 
   this._handle.initiv(cipher, toBuf(key), toBuf(iv)); 
           ^ 
   Error: Invalid key length 

谁能建议我如何做到这一点?

请您参考如下方法:

如果 key (和明文)使用 UTF-8 编码,则可以使用 Go 代码重构发布的密文。因此, key 大小为 24 字节,即应用 AES-192。

注意:(1) key 也可以进行 Base64 解码(AES-128),但这不会产生发布的密文。 (2) 此外,正如密文的解密所揭示的那样,发布的密文不对应于发布的明文 1234565434 ,而是对应于明文 7989878678

作为模式,使用CFB。 CFB 是一种不需要填充的流密码模式。 crypto 模块默认应用填充(PKCS7),但在流密码模式下自动禁用它。由于 Go 代码(具有实际上不必要的填充)是引用,因此必须在 NodeJS 代码中强制填充。这是可能的,例如使用 pkcs7-padding 包。

此外,Go 代码使用没有填充的 Base64url,例如使用 base64url 包。

以下 NodeJS 代码生成与发布的密文匹配的密文:

var crypto = require('crypto'); 
var pkcs7 = require('pkcs7-padding'); 
var base64url = require('base64url'); 
 
let iv = Buffer.from('00000000000000000000000000000000', 'hex'); 
let key = Buffer.from('dHRzbGNvbnNlbnR0ZWNobQ==','utf8'); 
let plaintext = Buffer.from('7989878678','utf8'); 
let plaintextPadded = pkcs7.pad(plaintext); 
 
let cipher = crypto.createCipheriv('aes-192-cfb', key, iv); 
let ivCiphertext = Buffer.concat([iv, cipher.update(plaintextPadded), cipher.final()]); 
console.log("ivCiphertext  --->> ", base64url(ivCiphertext)); 

注意:正如评论中已经提到的,出于安全原因, key /IV 对只能使用一次, here


标签:NodeJs
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号