javascript - AES 128 解密 : First char of CryptoJS. enc.Latin1 格式错误

标签 javascript encryption cryptography aes cryptojs

我有一个已编码的字符串,需要对其进行解密。我使用了 Crypto JS,经过一定的研究,我可以达到以下解决方案。

data = "+JdTb5BOloxaBHQlTw6NPLNV9lZix1OwhR3HF3IRtu2pdg/TLkrTw6Xu4JpKFlxE+zgOZavj0UynSZ+ojxmDXRbUlfyOc4YAncJVMXr28/AtfxZkNQoHbPIo7WxcSdidNE2k+DHZFcNNKOzYnvL1oDN4ezecs8Vo7K6vC5ZFLPUylXsi5sPsGye+TBbauPX+/wXa3hWUJVMNk6HUghW7l4N5Ei7HnrxLkFSFnz+9YUKYbFMEgV6wd9debHrpyytVhA3x2+Eyn5KnQ7iNJKQsNw==";
key = "062ec23950a55b9f8b21b0f9d45ca853";

// Decode the base64 data so we can separate iv and crypt text.
var rawData = atob(data);
var iv = rawData.substring(0,32);
var crypttext = rawData.substring(32);

// Decrypt...
var plaintextArray = CryptoJS.AES.decrypt(
  { ciphertext: CryptoJS.enc.Latin1.parse(crypttext) },
  CryptoJS.enc.Hex.parse(key),
  { iv: CryptoJS.enc.Latin1.parse(iv) }
);

var test = CryptoJS.enc.Latin1.stringify(plaintextArray);
console.log(test.toString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

上面的输出是

8«ÊWÒϬR¶jÛWY#ESPONSE_TEXT>
   <RESULT>OK</RESULT>
   <RESULT_CODE>-1</RESULT_CODE>
   <TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
   <COUNTER>2</COUNTER>
   </RESPONSE>

而不是

   <RESPONSE_TEXT>
   <RESULT>OK</RESULT>
   <RESULT_CODE>-1</RESULT_CODE>
   <TERMINATION_STATUS>SUCCESS</TERMINATION_STATUS>
   <COUNTER>2</COUNTER>
   </RESPONSE>

我无法找到为什么 8«ÊWÒÏØR¶jÛWY 会出现结果。请帮助找到丢失的线程。

最佳答案

使用 - CryptoJS.lib.WordArray.random(128/8) 生成 iv

data = "+JdTb5BOloxaBHQlTw6NPH2KFaA1mUL2vEuOqHmteozJutLfH1fQrDn+OE8Y1LgoFNqTjpuELCLB1noWbQ9Dz2g6NcD2vPAd4okiYArXnz+YKhVaGcqw+FTThjTWadMD/KvpzZ7SlxBh7HpCbZ/KMmxsOOnuk2F8pVEV3pkJMUgxV36c/iN9C+aRHPt95XRKzfU5ISaoBIq+/9K4WzW6i8yI8r6sdyRDoRc2q/EXuvX5666vdP1yojm2yhaL+1EwgkkYRn+GLyYuzFN1yCi+OA==";
key = "062ec23950a55b9f8b21b0f9d45ca853";

// Decode the base64 data so we can separate iv and crypt text.
var rawData = atob(data);
var iv = CryptoJS.lib.WordArray.random(128/8);
var crypttext = rawData;


// Decrypt...
var plaintextArray = CryptoJS.AES.decrypt(
  { 
  	ciphertext: CryptoJS.enc.Latin1.parse(crypttext)
  },
  CryptoJS.enc.Hex.parse(key),
  { 
    iv: CryptoJS.enc.Latin1.parse(iv),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  }
);

var decrypted = CryptoJS.enc.Latin1.stringify(plaintextArray);
console.log(decrypted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

fiddle - https://jsfiddle.net/guptasanchit90dev/p00fhmp4/

关于javascript - AES 128 解密 : First char of CryptoJS. enc.Latin1 格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49790225/

相关文章:

python - mysql 加密在 INSERT 和 UPDATE 上的行为是否不同?

c# - 这足以签署数据吗?

web-services - Twitter 的 oauth 客户端 Web UI 中隐藏的真实性 token 的安全性如何?

javascript - 第一个事件处理程序覆盖第二个事件处理程序

Javascript Canvas 选择器

c# - Java 等同于 C# 的 Rfc2898DerivedBytes

android - 图像解密不工作android

javascript - 当组合框值更改时,JQuery 隐藏行(按属性)

javascript - 根据location.hash传递的数据重新渲染ReactJS嵌套子组件

hash - 是否可以解密 MD5 哈希值?