Код C # на TripleDESCryptoServiceProvider дает значение, отличное от cryptojs - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь транспонировать код ac # в javascript, используя cryptojs, а в коде c # он использует TripleDESCryptoServiceProvider. Я могу получить все точно значения C # в моем коде JavaScript, за исключением части шифрования. Я получаю другой результат по шифрованию. Посмотрите мой код на c # и javascript.

C # открытая статическая строка EncryptTxt (строковый ключ, строка msg, режим CipherMode, Int16 KeyOffSet) {SHA512CryptoServiceProvider sha = new SHA512CryptoServiceProvider ();байт [] newKey = новый байт [23];

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 # Результат

enter image description here

Результат Javasctipt

enter image description here

Подскажите, пожалуйста, как это правильно сделать. Я действительно ценю это!

...