c# - 与 C# 相比,Javascript 中的 TripleDES 实现不同

标签 c# javascript cryptojs tripledes

我需要复制以下 C# 方法来加密来自 Javascript 的一些文本。目前我正在使用 Crypto JS ,但是 JS 的输出不等于 C# 的输出。

const string EncryptKey = "hello";

private static String getHexStringFromArray(byte[] arr) {
    StringBuilder sBuilder = new StringBuilder();

    for (int i = 0; i < arr.Length; i++) {
        sBuilder.Append(arr[i].ToString("x2"));
    }

    return sBuilder.ToString();
}    

public void Encrypt(string toEncrypt, bool useHashing) {
    byte[] keyArray;
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

    string key = EncryptKey;

    if (useHashing) {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));

        hashmd5.Clear();
    } else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    Console.WriteLine("hexadecimal key: " + getHexStringFromArray(keyArray));

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] resultArray =
        cTransform.TransformFinalBlock(toEncryptArray, 0,
            toEncryptArray.Length);

    tdes.Clear();

    Console.WriteLine("hexadecimal encrypted: " + getHexStringFromArray(resultArray));

    //Return the encrypted data into unreadable string format
    string test = Convert.ToBase64String(resultArray, 0, resultArray.Length);

    Console.WriteLine("Output: " + test);
}

Encrypt("password", true) 的输出是:

hexadecimal key: 5d41402abc4b2a76b9719d911017c592
hexadecimal encrypted: 069c44845e907b346b9d82d1d553f391
Output: BpxEhF6QezRrnYLR1VPzkQ==

现在,Javascript 实现(请忽略全局变量):

window.text = "password";
window.key = "hello";
var useHashing = true;

if (useHashing){
    key = CryptoJS.MD5(key).toString();
}

window.options = {
    mode: CryptoJS.mode.ECB, 
    padding: CryptoJS.pad.Pkcs7
};

window.textWordArray = CryptoJS.enc.Utf8.parse(text);
window.keyHex = CryptoJS.enc.Hex.parse(key);

console.log('hexadecimal key: ' + keyHex);

window.encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options);

var base64String = encrypted.toString();

console.log('base64: ' + base64String);

window.decrypted = CryptoJS.TripleDES.decrypt( {
    ciphertext: CryptoJS.enc.Base64.parse(base64String)
}, keyHex, options);

console.log('decrypted: ' + decrypted.toString(CryptoJS.enc.Utf8));

产生这个结果:

hexadecimal key: 5d41402abc4b2a76b9719d911017c592
base64: BK5f0AhEuUl9pYEy2Mliyw== 

这与 C# 实现不同。

Here你可以找到 Javascript 代码。

有什么帮助吗?

最佳答案

TripleDES 需要 24 字节 key (k1 + k2 + k3)。您的 key 只有 16 个字节。 .NET 自动完成 k3 = k1。但是Javascript没有,k3 = 0。请修改key:

if (useHashing){
   key = CryptoJS.MD5(key).toString();
   var k1 = key.substring(0, 16);
   key = key + k1;
}

关于c# - 与 C# 相比,Javascript 中的 TripleDES 实现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247953/

相关文章:

c# - .Net 3.5 到 4 的迁移导致应用程序变慢

c# - WCF 服务方法中单例模式的问题

php - 如何在提交表单后关闭浏览器选项卡?

javascript - CryptoJS 是否可以进行二进制散列?

c# - System.IO.FileSystemWatcher.CompletionStatusChanged 处的 System.ArgumentOutOfRangeException

c# - 删除图片的url但图片不删除

php - 使用 Javascript/jQuery 获取基于段的 URL 中的查询字符串

javascript - 如果 var a = function b(){} 会发生什么

javascript - 如何在 CryptoJS 中使用私钥 (pem) 签署 JWT?

java - 如何使用 crypto-js 库在客户端加密消息并在 Java 服务器上解密