首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用密码js解密

用密码js解密
EN

Stack Overflow用户
提问于 2021-06-10 23:54:48
回答 1查看 759关注 0票数 1

我从包含加密数据的API中接收第三方的数据。他们向我提供了一个密码,do解密了Json文件的内容,但我没有得到任何结果;因此,他们向我提供了生成用VB.NET编写的加密的代码:

代码语言:javascript
复制
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

我试着用:

代码语言:javascript
复制
let key = CryptoJS.enc.Utf8.parse(Passphrase);
let decryptedData = CryptoJS.AES.decrypt(Message, key, {
  iv: key
});
alert(decryptedData.toString( CryptoJS.enc.Utf8 ));

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

如果我做了

代码语言:javascript
复制
const passworddes = CryptoJS.DES.decrypt(message, key, {
      mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7
    }).toString();

我只得到一个空的字符串

我解密的时候遗漏了什么吗?

谢谢你们所有人。

更新:

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

以下是他们所使用的功能:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-11 06:19:21

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

代码语言:javascript
复制
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)
代码语言:javascript
复制
<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.

f 211

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67929717

复制
相关文章

相似问题

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