【问题标题】:Decrypting with crypto-js使用 crypto-js 解密
【发布时间】:2023-03-17 20:10:01
【问题描述】:

我通过包含加密数据的 API 接收来自第三方的数据。他们为我提供了一个密码来解密 Json 文件的内容,但我没有得到任何结果;所以他们向我提供了他们生成加密的代码,这些代码是用 VB.NET 编写的:

Public Shared Function EncryptString(ByVal Message As String, ByVal Passphrase As String) As String
        Dim Results As Byte()
        Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding()
        Dim HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
        Dim TDESKey As Byte() = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase))
        Dim TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider()
        TDESAlgorithm.Key = TDESKey

        TDESAlgorithm.Mode = CipherMode.ECB
        TDESAlgorithm.Padding = PaddingMode.PKCS7
        Dim DataToEncrypt As Byte() = UTF8.GetBytes(Message)
        Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor()
        Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)
        Return Convert.ToBase64String(Results)
    End Function

我试图解密:

let key = CryptoJS.enc.Utf8.parse(Passphrase);
let decryptedData = CryptoJS.AES.decrypt(Message, key, {
  iv: key
});
alert(decryptedData.toString( CryptoJS.enc.Utf8 ));

但我得到一个空字符串和这个控制台错误:错误:格式错误的 UTF-8 数据

如果我这样做

const passworddes = CryptoJS.DES.decrypt(message, key, {
      mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7
    }).toString();

我只得到一个空字符串

我在解密时遗漏了什么吗?

谢谢大家。

更新:

供应商向我提供了他们用来解密的功能。在上面的 Typescript 代码中,我在 .NET 代码中设置了模式和填充,但仍然一无所获。

这是他们使用的功能:

Public Shared Function DecryptString(ByVal Message As String, ByVal Passphrase As String) As String
        Dim Results As Byte()
        Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding()
        Dim HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
        Dim TDESKey As Byte() = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase))
        Dim TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider()
        TDESAlgorithm.Key = TDESKey
        TDESAlgorithm.Mode = CipherMode.ECB
        TDESAlgorithm.Padding = PaddingMode.PKCS7
        Dim DataToDecrypt As Byte() = Convert.FromBase64String(Message)
        Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor()
        Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)
        Return UTF8.GetString(Results)
    End Function

【问题讨论】:

  • 您的第一个示例似乎使用了错误的算法。为了匹配 VB 代码,它应该是 DES(就像在你的第二个例子中一样)。您的密钥和密文是如何存储的?在解密之前是否需要从 base64 解码?

标签: angular typescript encryption cryptojs


【解决方案1】:

VB 代码使用 MD5 从密码短语派生密钥。具有 16 字节密钥 (2TDEA) 的 TripleDES(又名 3DES)用作算法。采用欧洲央行作为模式。 CryptoJS 可能的解密方法是:

var key = CryptoJS.MD5('my passphrase');
var message = 'vg0m/29RO6Y9o5SATGFj4H3p612sIIk6/Ny1wtr8HLomM3gI5WYYNKy//pAjq/ZJ'
const decrypted = CryptoJS.TripleDES.decrypt(
    message, 
    key, 
    {
        mode: CryptoJS.mode.ECB, 
        padding: CryptoJS.pad.Pkcs7
    }
).toString(CryptoJS.enc.Utf8);
console.log(decrypted)
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

在上面的例子中,密文是用 VB 代码创建的。

请注意,代码非常不安全:

  • MD5 坏了,更好的是:SHA256。
  • 从摘要派生的密钥也是不安全的(即使摘要是安全的),更好的是:可靠的密钥派生函数,如 Argon2 或 PBKDF2。
  • ECB 不安全,更好:CBC,甚至更好:GCM。
  • TripleDES 已弃用且速度较慢,但​​更好:AES。

【讨论】:

  • 嗨托帕科。您的代码运行良好,我用 Javascript 进行了尝试。太棒了,但由于某种原因,我在 Angular 上没有得到任何内容,所以发生了其他事情,我会找出它是什么。非常感谢您的帮助。
  • 关于您的笔记,您是对的,但这是我的供应商提供信息的方式(它是一家老保险公司,其遗留应用程序已有近 20 年历史)。再次感谢托帕科!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2012-12-28
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2013-08-16
  • 2020-11-24
相关资源
最近更新 更多