求助:使用node的crypto模块,对由C#加密过的数据进行解密,结果与C#解密的结果不一致。(注:加密使用相同的KEY和IV)
发布于 8个月前 作者 Finebyme1 521 次浏览
    ==========  C#代码  ==========
    private static byte[] KEY = { 1, 2, 3, 4, 5, 6, 7, 8 };
    private static byte[] IV = { 1, 2, 3, 4, 5, 6, 7, 8 };
    public static string EncryptDes(string input)
    {
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        MemoryStream ms = null;
        CryptoStream encStream = null;
        StreamWriter sw = null;
        string result = String.Empty;

        try
        {
            ms = new MemoryStream();
            encStream = new CryptoStream(ms, des.CreateEncryptor(KEY, IV), CryptoStreamMode.Write);

            // Create a StreamWriter to write a string
            // to the stream.
            sw = new StreamWriter(encStream);

            // Write the plaintext to the stream.
            sw.WriteLine(input);

            sw.Flush();
            encStream.FlushFinalBlock();
            ms.Flush();

            byte[] bytes = ms.GetBuffer();
            Console.WriteLine(BitConverter.ToString(bytes, 0, 24));

            result = Convert.ToBase64String(bytes, 0, Convert.ToInt32(ms.Length, CultureInfo.InvariantCulture));
        }
        finally
        {
            //close objects
        }
        return result;
    }

    ==========  Node.js代码  ==========

var crypto = require(‘crypto’); var KEY = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; var IV = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; exports.encryptDes = function(input){ var cipher = crypto.createCipheriv('des’, new Buffer(KEY), new Buffer(IV)); var buf1 = cipher.update(input, ‘utf8’); var buf2 = cipher.final(); var result = new Buffer(buf1.length + buf2.length); buf1.copy(result); buf2.copy(result, buf1.length);

return result.toString('base64');

};

4 回复

我也碰到过类似的,我当时是用C加密,node解密,C加密的时候是没有IV这个参数的,node解密的时候IV向量用的是16字节的0,结果和C保持一致了。只知道这么解决了,资料比较少,当时没有搞懂,现在同求大神解答。 ps:C不是很懂,依样画葫芦,使用的时候只需要传一个key参数就可以了,而node是有两种方法的,当时我就混乱了

主要是以前C#的系统中使用了 IV 这个变量来加密,所以Node这边要解密C#那边遗留下的数据的话,按理说两边是需要使用相同的 IV 向量的。问题是现在两边都用同一个 IV,但是出来的结果却不一样。网上相关的资料也很少,只能等大神来解答~

每个加密算法的实现都是有差异的,网上找找跨语言的加密库。

哈哈,刚刚把问题解决了。原来上面C#代码在使用StreamWriter写加密流的时候使用了 sw.WriteLine(input) 这个方法,导致了最后多了两个字节(0D, 0A),而Node那边因为少了这两个字节,所以加密出来的结果不一样。 刚刚我手动给Node的数据加上0D, 0A两个字节后,加密出来的结果是一样的。所以我想Node和.NET在对DES加密算法的实现应该是一样的吧。不过还是谢谢你的热心回答~

回到顶部