首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TripleDES .Net to TripleDES (密码-js) Javascript

TripleDES .Net to TripleDES (密码-js) Javascript
EN

Stack Overflow用户
提问于 2019-05-08 04:53:08
回答 1查看 725关注 0票数 1

我花了一段时间研究所有的解决方案,但似乎还是有些不对劲。我在.Net中看到的加密字符串与我在Cryto中看到的输出不匹配。有什么不对的?

代码语言:javascript
复制
    public static void Encrypt()
    {
        string toEncrypt = "123456";
        string key = "hello";

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        byte[] keyArray = hashmd5.ComputeHash(UnicodeEncoding.Unicode.GetBytes(key));
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] toEncryptArray = UnicodeEncoding.Unicode.GetBytes(toEncrypt);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        string finalString = Convert.ToBase64String(resultArray);

        Console.WriteLine("Output encrypted .Net: " + finalString);
    }

而使用crypto的等价Javascript是

代码语言:javascript
复制
    Encrypt = () => {
        var CryptoJS = require('crypto-js');
        var text = '123456'
        var key = "hello";

        key = CryptoJS.enc.Utf16LE.parse(key);
        key = CryptoJS.MD5(key)

        var options = {
           mode: CryptoJS.mode.ECB, 
        };

        var textWordArray = CryptoJS.enc.Utf16LE.parse(text); 
        var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, key, options);   
        var base64String = encrypted.toString();    
        console.log('Output JS Encrypted: ' + base64String);   
     }  

我得到了yGOnLhoVpIHQOCbAn51FTA==的.Net和d5Lg8k8cz68T6akDI0KQrA==的密码-js。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-09 18:12:49

我已经解决了这个问题。tripledes.js (CryptoJS包)内部的控制台日志显示,在MD5 Hash之后,我又丢失了64位。

代码语言:javascript
复制
this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));

key.words长度为4,而非6。因此,des3有一种空的假丝。解决方法是将索引0和1的值推入关键字数组。当长度现在为6时,des3得到des1的值。即keyWords.slice(0,2) = keyWords.slice(4,6)。

代码语言:javascript
复制
Encrypt = () => {
    var CryptoJS = require('crypto-js');
    var text = '123456'
    var key = "hello";

    key = CryptoJS.enc.Utf16LE.parse(key);
    key = CryptoJS.MD5(key)
    key.words.push(key.words[0], key.words[1]) // FIX FIX FIX

    var options = {
       mode: CryptoJS.mode.ECB, 
    };

    var textWordArray = CryptoJS.enc.Utf16LE.parse(text); 
    var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, key, options);   
    var base64String = encrypted.toString();    
    console.log('Output JS Encrypted: ' + base64String);   
 }  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56033746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档