使用 crypto-js 解密
Decrypting with crypto-js
我在 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 代码使用 MD5 从密码导出密钥。具有 16 字节密钥 (2TDEA) 的 TripleDES(又名 3DES)用作算法。 ECB 被用作模式。使用 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。
我在 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 代码使用 MD5 从密码导出密钥。具有 16 字节密钥 (2TDEA) 的 TripleDES(又名 3DES)用作算法。 ECB 被用作模式。使用 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。