我真的需要你的帮助。我已经做了一个星期了。为什么使用c#和javascript cryptojs在TripplesDes上进行加密时会得到不同的结果?请在下面查看我的代码。
c#
public static string EncryptTxt()
{
SHA512CryptoServiceProvider sha = new SHA512CryptoServiceProvider();
using (var tdes = new TripleDESCryptoServiceProvider())
{
var msg = 'jvofs:JCV XXXXX:201911141547:12345678';
var key = 'jjvofs';
var keyOffset = 10;
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
byte[] Results;
byte[] newKeyx = new byte[24];
byte[] keybyte = sha.ComputeHash(Encoding.UTF8.GetBytes(key));
Array.Copy(keybyte, keyOffset, newKeyx, 0, newKeyx.Length);
TDESAlgorithm.Key = newKeyx;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
byte[] DataToEncrypt = UTF8.GetBytes(msg);
try
{
ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
}
finally
{
TDESAlgorithm.Clear();
}
var a = Convert.ToBase64String(DataToEncrypt);
var b = Convert.ToBase64String(newKeyx);
var c = Convert.ToBase64String(Results);
return Convert.ToBase64String(Results);
}
}
[使用cryptojs的JavaScript
txtEncrypter = () => {
const msg = 'jvofs:JCV XXXXX:201911141547:12345678';
const key = 'jjvofs';
const keyOffset = 10;
const keybyte: any = this.wordArrayToByteArray(crypto.SHA512(key), 100);
// For message
const dataToEncrypt = crypto.enc.Utf8.parse(msg);
const dte = this.wordArrayToByteArray(dataToEncrypt, 100);
const dataToEncryptx = this._arrayBufferToBase64(dte);
const dataToEncryptxx = crypto.enc.Utf8.parse(dataToEncryptx);
// For key
let newKeyx = keybyte.slice(keyOffset, 34);
const newKeyxB4Splice = newKeyx;
const newKeyxB4Splicex = this._arrayBufferToBase64(newKeyx);
newKeyx = crypto.enc.Utf8.parse(newKeyx);
const options = {
mode: crypto.mode.ECB,
padding: crypto.pad.Pkcs7
};
const encrypted = crypto.TripleDES.encrypt(dataToEncrypt, newKeyx, options);
const base64String = encrypted.toString();
console.log(base64String);
}
解析消息和密钥的数据时,c#和javascript都是相同的:
消息:
[[C#] anZvZnM6SkNWIFhYWFhYOjIwMTkxMTE0MTU0NzoxMjM0NTY3OA ==
[cryptojs] anZvZnM6SkNWIFhYWFhYOjIwMTkxMTE0MTU0NzoxMjM0NTY3OA ==
键:
[C#] smbkkmDrCBdRev7S4hLaWE16Nvym + 9gW
[cryptojs] smbkkmDrCBdRev7S4hLaWE16Nvym + 9gW
但是只要“ crypto.TripleDES.encrypt(....)”运行,我就会得到c#和javascript的不同结果:
[[C#] 1pjvBOB81iAOqsskZ + cM080yDU37XBoCwMhbYULwva / Nql5vbEMiPQ ==
[cryptojs] ncCcCYNy3jVsB / 95SaC2N1rH5Q + hX04WvScMvwmtkPkrnL7Ki1bmPg ==
请帮助我。非常感谢。
查看我的评论
public static string EncryptTxt()
{
SHA512CryptoServiceProvider sha = new SHA512CryptoServiceProvider();
using (var tdes = new TripleDESCryptoServiceProvider())
{
var msg = "jvofs:JCV XXXXX:201911141547:12345678";
var key = "jjvofs";
var keyOffset = 10;
var UTF8 = new UTF8Encoding();
var TDESAlgorithm = new TripleDESCryptoServiceProvider();
byte[] Results;
byte[] newKeyx = new byte[24];
// keybyte = 64 bytes
byte[] keybyte = sha.ComputeHash(Encoding.UTF8.GetBytes(key));
// now you copy byte 10..33 from the keybyte[64] into newKeyx[24]
// why???
Array.Copy(keybyte, keyOffset, newKeyx, 0, newKeyx.Length);
TDESAlgorithm.Key = newKeyx;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
byte[] DataToEncrypt = UTF8.GetBytes(msg);
try
{
var Encryptor = TDESAlgorithm.CreateEncryptor();
Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
}
finally
{
TDESAlgorithm.Clear();
}
var a = Convert.ToBase64String(DataToEncrypt);
var b = Convert.ToBase64String(newKeyx);
var c = Convert.ToBase64String(Results);
return Convert.ToBase64String(Results);
}
}