首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Node.js解密AES-256-CBC密码

用Node.js解密AES-256-CBC密码
EN

Stack Overflow用户
提问于 2022-07-05 07:42:13
回答 1查看 961关注 0票数 1

我正试图使用Node.js从web服务中解密一个AES-256-CBC密文,但似乎无法让它工作,而且真的丢失了。

代码语言:javascript
运行
复制
  const raw = `{
    "iv":"uUwGJgxslfYiahji3+e2jA==",
    "docMimeType":"text\/xml",
    "doc":"1XLjWZlMMrgcpR6QtfwExQSOOPag1BJZTo1QEkcDrY6PFesWoVw8xrbHFsEYyMVDeemzk+5kBnb3\r\nqBmcUtkSFs7zDsxjYZkkEU9nyq1jXFz99fGylIealw37FPMaK0gviXESRO5AHMs46tpgSQcuWX0Z\r\nV7+mnTvjmaRHi4p1Cvg8aYfDO1aIWWWjAwOTCyopyCwribbGoEdiYDc5pERHpw=="
  }`;

  const cleanedEncryptedDataAsJsonStr = raw.replace(/\r?\n|\r/g, " ")

  const data = JSON.parse(cleanedEncryptedDataAsJsonStr)
  const ivBase64 = data.iv
  const iv = Buffer.from(ivBase64, 'base64').toString('hex').substring(0, 16)

  const plainKey = 'PHilheaLthDuMmyciPHerKeyS'
  const hashKey = crypto.createHash('sha256');
  hashKey.update(plainKey)
  const key = hashKey.digest('hex').substring(0, 32)

  let encrypted = Buffer.from(data.doc, 'base64').toString('hex')
  const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv)
  let decrypted = decipher.update(encrypted, 'hex', 'utf-8')
  decrypted += decipher.final('utf-8')

因此,我正在接收一个包含iv和加密数据(Doc)的json对象,并且我有一个密码密钥的副本,根据文档需要在解密过程中对其进行散列。

doc:加密数据的base64编码

iv:加密过程中初始化向量的base64编码值

当我运行代码时,错误是:

Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length,也不确定如何在原始的json字符串中处理\r\n

解密后的消息应该是:

<eEMPLOYERS ASOF="07-02-2022"><employer pPEN="110474000002" pEmployerName="JOSE A TERAMOTO ODM" pEmployerAddress="ORANBO, PASIG CITY"/></eEMPLOYERS

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-05 09:12:30

守则中存在以下问题:

  • IV和key不能被十六进制编码。
  • 默认的PKCS#7填充必须禁用,因为零填充是在加密期间应用的(如果需要,显式删除尾随的0x00填充字节)。

固定代码:

代码语言:javascript
运行
复制
var crypto = require('crypto')

const raw = `{
    "iv":"uUwGJgxslfYiahji3+e2jA==",
    "docMimeType":"text\/xml",
    "doc":"1XLjWZlMMrgcpR6QtfwExQSOOPag1BJZTo1QEkcDrY6PFesWoVw8xrbHFsEYyMVDeemzk+5kBnb3\r\nqBmcUtkSFs7zDsxjYZkkEU9nyq1jXFz99fGylIealw37FPMaK0gviXESRO5AHMs46tpgSQcuWX0Z\r\nV7+mnTvjmaRHi4p1Cvg8aYfDO1aIWWWjAwOTCyopyCwribbGoEdiYDc5pERHpw=="
  }`;

const cleanedEncryptedDataAsJsonStr = raw.replace(/\r?\n|\r/g, " ") 

const data = JSON.parse(cleanedEncryptedDataAsJsonStr)
const ivBase64 = data.iv
const iv = Buffer.from(ivBase64, 'base64') // .toString('hex').substring(0, 16) // Fix 1: no hex encoding

const plainKey = 'PHilheaLthDuMmyciPHerKeyS'
const hashKey = crypto.createHash('sha256')
hashKey.update(plainKey)
const key = hashKey.digest() // .digest('hex').substring(0, 32) // Fix 2: no hex encoding

let encrypted = Buffer.from(data.doc, 'base64').toString('hex')
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv)
decipher.setAutoPadding(false) // Fix 3: disable default PKCS#7 padding
let decrypted = decipher.update(encrypted, 'hex', 'utf-8')
decrypted += decipher.final('utf-8')

console.log(decrypted) // plaintext zero-padded, if necessary remove trailing 0x00 values, e.g. as in the following:
console.log(decrypted.replace(new RegExp("\0+$"), "")) // <eEMPLOYERS ESOF="07-02-2022"><employer pPEN="110474000002" pEmployerName="JOSE A TERAMOTO ODM" pEmployerAddress="ORANBO, PASIG CITY"/></eEMPLOYERS>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72865693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档