三重 des 加密 c# 并在 javascript 中解密
triple des encrypt c# and decrypt in javascript
我有一个 C# 加密字符串需要在 node.js 中解密。我目前正在使用 cryptoJS 作为解密器。
以下是在 C# 中对字符串进行初始加密的代码:
CryptoAgent 构造函数使用 Guid 构建算法密钥和初始化向量。例如,“A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B”。
public CryptoAgent(Guid keyGuid)
{
_UseSymmetricEncryption = true;
byte[] guidArr = keyGuid.ToByteArray();
Array.Resize<byte>(ref guidArr, 24);
_Key = (byte[])guidArr.Clone();
Array.Reverse(guidArr);
_IV = guidArr;
}
加密方法非常简单。它获取纯文本并使用上面创建的密钥和 iv 加密数据,然后 returns 它在 URL 友好字符串中。例如,
"Email=testuser@gmail.com&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B"
private string EncryptSymmetric(string plainText)
{
if (string.IsNullOrEmpty(plainText))
{
throw new ArgumentNullException("The string to be encrypted cannot be null.");
}
ICryptoTransform transform;
TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider();
transform = csp.CreateEncryptor(_Key, _IV);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
byte[] plaintextBytes = Encoding.Unicode.GetBytes(plainText);
cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedData = memoryStream.GetBuffer();
Console.WriteLine(csp.Mode);
Console.WriteLine(csp.Padding);
return UrlNormalize(Convert.ToBase64String(encryptedData, 0, (int)memoryStream.Length));
}
生成的加密字符串如下:
ZuD6CIEY6b-sh9Q6DRh9SWE0YyC92Jmw1oplTqy7kjETXoNio42hoJxDmMr7V-Sp14aX9lwTxYBM_KjA
bEevElE_7nUzC_C4nM13LHHbpg6aR8xO39RseQjpLCLYj5ZKKWiXZREqpvDBlvtF-F1VuqyAMa0ECYOD
N8ZCcmmyIHuCpalcUkLZ0zZajwutIrtmmqg3VXQNT3E~
我的任务是接收这个加密的字符串并解密 node.js 中的字符串并解析出两个参数以供进一步使用。下面是我的初始解密文件:
var CryptoJS = require("crypto-js");
var text = "Email=testuser@gmail.com&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B";
var key = "A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B";
var useHashing = true;
if (useHashing){
key = CryptoJS.MD5(key).toString();
key = key + '0000000000000000';
}
var textWordArray = CryptoJS.enc.Utf16.parse(text);
var keyHex = CryptoJS.enc.Hex.parse(key);
var iv = reverseHexString(keyHex.toString());
var ivHex = CryptoJS.enc.Hex.parse(iv);
console.log('hexadecimal key: ' + keyHex + '\n');
console.log('hexadecimal iv: ' + ivHex + '\n');
var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivHex
};
var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options);
var base64String = encrypted.toString();
console.log('base64: ' + base64String + '\n');
var decrypted = CryptoJS.TripleDES.decrypt( {
ciphertext: CryptoJS.enc.Base64.parse(base64String)
}, keyHex, options);
console.log('decrypted: ' + decrypted.toString(CryptoJS.enc.Utf16));
function reverseHexString(hexStr) {
var first32 = hexStr.substring(0, 32);
var reverseFirst32 = first32.split("").reverse().join("").split("");
var reverseHex = '0000000000000000';
for (var i = 0; i < reverseFirst32.length; i+=2) {
reverseHex += reverseFirst32[i+1];
reverseHex += reverseFirst32[i];
};
return reverseHex;
}
我最初的 运行 解决方案导致解密失败并产生一行问号。
使用 C# 代码,我能够打印出密钥和 iv 值。我试图用从 C# 打印的密钥和 iv 值替换 keyHex 和 ivHex Javascript 值,但解密仍然失败。
非常感谢可以提供的任何帮助。
谢谢
这不起作用的原因可能是密钥生成:您使用 ASCII 零而不是 [=10=]
并且您有 16 个而不是 8 个(MD5 给出 16 个字节,而您想要一个 24 字节的 TDES钥匙)。这对密钥来说并不坏,因为 CryptoJS 只会忽略额外的字节,但由于您反转密钥以获得 IV,因此您得到的是错误的 IV。
我有一个 C# 加密字符串需要在 node.js 中解密。我目前正在使用 cryptoJS 作为解密器。
以下是在 C# 中对字符串进行初始加密的代码:
CryptoAgent 构造函数使用 Guid 构建算法密钥和初始化向量。例如,“A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B”。
public CryptoAgent(Guid keyGuid)
{
_UseSymmetricEncryption = true;
byte[] guidArr = keyGuid.ToByteArray();
Array.Resize<byte>(ref guidArr, 24);
_Key = (byte[])guidArr.Clone();
Array.Reverse(guidArr);
_IV = guidArr;
}
加密方法非常简单。它获取纯文本并使用上面创建的密钥和 iv 加密数据,然后 returns 它在 URL 友好字符串中。例如, "Email=testuser@gmail.com&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B"
private string EncryptSymmetric(string plainText)
{
if (string.IsNullOrEmpty(plainText))
{
throw new ArgumentNullException("The string to be encrypted cannot be null.");
}
ICryptoTransform transform;
TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider();
transform = csp.CreateEncryptor(_Key, _IV);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
byte[] plaintextBytes = Encoding.Unicode.GetBytes(plainText);
cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedData = memoryStream.GetBuffer();
Console.WriteLine(csp.Mode);
Console.WriteLine(csp.Padding);
return UrlNormalize(Convert.ToBase64String(encryptedData, 0, (int)memoryStream.Length));
}
生成的加密字符串如下:
ZuD6CIEY6b-sh9Q6DRh9SWE0YyC92Jmw1oplTqy7kjETXoNio42hoJxDmMr7V-Sp14aX9lwTxYBM_KjA bEevElE_7nUzC_C4nM13LHHbpg6aR8xO39RseQjpLCLYj5ZKKWiXZREqpvDBlvtF-F1VuqyAMa0ECYOD N8ZCcmmyIHuCpalcUkLZ0zZajwutIrtmmqg3VXQNT3E~
我的任务是接收这个加密的字符串并解密 node.js 中的字符串并解析出两个参数以供进一步使用。下面是我的初始解密文件:
var CryptoJS = require("crypto-js");
var text = "Email=testuser@gmail.com&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B";
var key = "A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B";
var useHashing = true;
if (useHashing){
key = CryptoJS.MD5(key).toString();
key = key + '0000000000000000';
}
var textWordArray = CryptoJS.enc.Utf16.parse(text);
var keyHex = CryptoJS.enc.Hex.parse(key);
var iv = reverseHexString(keyHex.toString());
var ivHex = CryptoJS.enc.Hex.parse(iv);
console.log('hexadecimal key: ' + keyHex + '\n');
console.log('hexadecimal iv: ' + ivHex + '\n');
var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivHex
};
var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options);
var base64String = encrypted.toString();
console.log('base64: ' + base64String + '\n');
var decrypted = CryptoJS.TripleDES.decrypt( {
ciphertext: CryptoJS.enc.Base64.parse(base64String)
}, keyHex, options);
console.log('decrypted: ' + decrypted.toString(CryptoJS.enc.Utf16));
function reverseHexString(hexStr) {
var first32 = hexStr.substring(0, 32);
var reverseFirst32 = first32.split("").reverse().join("").split("");
var reverseHex = '0000000000000000';
for (var i = 0; i < reverseFirst32.length; i+=2) {
reverseHex += reverseFirst32[i+1];
reverseHex += reverseFirst32[i];
};
return reverseHex;
}
我最初的 运行 解决方案导致解密失败并产生一行问号。
使用 C# 代码,我能够打印出密钥和 iv 值。我试图用从 C# 打印的密钥和 iv 值替换 keyHex 和 ivHex Javascript 值,但解密仍然失败。
非常感谢可以提供的任何帮助。
谢谢
这不起作用的原因可能是密钥生成:您使用 ASCII 零而不是 [=10=]
并且您有 16 个而不是 8 个(MD5 给出 16 个字节,而您想要一个 24 字节的 TDES钥匙)。这对密钥来说并不坏,因为 CryptoJS 只会忽略额外的字节,但由于您反转密钥以获得 IV,因此您得到的是错误的 IV。