Javascript TripleDESCryptoServiceProvider上的C#代码给出了与cryptojs不同的值
我正在尝试使用cryptojs将c代码转换为javascript,并在c代码中使用TripleDESCryptoServiceProvider。除了加密部分之外,我可以在javascript代码中完全获得C#的值。我得到了不同的加密结果。 请参阅我在c#和javascript上的代码 C# 公共静态字符串EncryptTxt(字符串密钥、字符串消息、密码模式、Int16密钥偏移) { SHA512CryptoServiceProvider sha=新的SHA512CryptoServiceProvider(); 字节[]新键=新字节[23]Javascript TripleDESCryptoServiceProvider上的C#代码给出了与cryptojs不同的值,javascript,c#,cryptojs,Javascript,C#,Cryptojs,我正在尝试使用cryptojs将c代码转换为javascript,并在c代码中使用TripleDESCryptoServiceProvider。除了加密部分之外,我可以在javascript代码中完全获得C#的值。我得到了不同的加密结果。 请参阅我在c#和javascript上的代码 C# 公共静态字符串EncryptTxt(字符串密钥、字符串消息、密码模式、Int16密钥偏移) { SHA512CryptoServiceProvider sha=新的SHA512CryptoServicePro
using (var tdes = new TripleDESCryptoServiceProvider())
{
byte[] Results;
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(key));
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
byte[] keybyte = sha.ComputeHash(Encoding.UTF8.GetBytes(key));
byte[] newKeyx = new byte[24];
Array.Copy(keybyte, KeyOffSet, newKeyx, 0, newKeyx.Length);
TDESAlgorithm.Key = newKeyx;
TDESAlgorithm.Mode = mode;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
byte[] DataToEncrypt = UTF8.GetBytes(msg);
try
{
ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
}
finally
{
TDESAlgorithm.Clear();
HashProvider.Clear();
}
return Convert.ToBase64String(Results);
}
javascript
encryptText = () => {
debugger;
const msg = 'Autosweep2Go1:juan:201910181809:12345678';
let key = crypto.enc.Utf8.parse('xxx');
key = crypto.MD5(key);
key.words.push(key.words[0], key.words[1]);
const iv = crypto.enc.Utf8.parse('xxx');
// MD5CryptoServiceProvider
const hashProvider = crypto.MD5(iv);
const TDESKey = this.wordArrayToByteArray(hashProvider, 8);
const keybyte = this.wordArrayToByteArray(crypto.SHA512(iv), 16);
const newKeyx = new Uint8Array(24);
const newkeybyte = keybyte.slice(10, 34);
// Object.assign(newKeyx, newkeybyte);
const TDESAlgorithmKey = newkeybyte;
const DataToEncrypt = this.wordArrayToByteArray(crypto.enc.Utf8.parse(msg), 40);
const dteLength = DataToEncrypt.length;
const encrypted = crypto.TripleDES.encrypt(crypto.enc.Utf8.parse(msg),
crypto.enc.Utf8.parse(newkeybyte),
{
mode: crypto.mode.ECB,
padding: crypto.pad.Pkcs7,
});
const result = this.wordArrayToByteArray(encrypted.ciphertext, dteLength);
const x = this.wordArrayToByteArray(crypto.enc.Utf8.parse(encrypted.toString()), dteLength);
console.log(encrypted);
return encrypted;
}
C#结果
Javasctipt结果
你能告诉我怎么做吗。我真的很感激 在您的C#代码中不存在IV,尽管这看起来有点奇怪,因为您定义了多个变量(键和IV),但只使用其中一个。我只是为了调试原因而交换它们。我一上班就要清理代码。IV和钥匙和我理解的一样。对吗?“IV和密钥与我理解的方式相同。”-不,IV(有点)与加密的关系就像盐与散列的关系一样。有关更多信息,请参阅关于IV。