[¥100]将一段加/解密C#代码改写为Nodejs,提示
发布于 3 个月前 作者 ylyxf 1194 次浏览 来自 问答

各位同学,手上有一段C#代码,希望转为NodeJS的。参考了

		private static void Decode(string text)
        {
            MemoryStream memoryStream = new MemoryStream();
            RijndaelManaged rijndaelManaged = new RijndaelManaged();
            byte[] array = Convert.FromBase64String(text);
            byte[] rgbKey = Convert.FromBase64String("RTgklqOuVBZ=");
            byte[] rgbIV = Convert.FromBase64String("3FH9eyHK7mfgtwF81RIwgA==");
            CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            cryptoStream.Write(array, 0, array.Length);
            cryptoStream.Close();
            memoryStream.Close();
            Console.WriteLine("解密后:");
            Console.WriteLine(Encoding.UTF8.GetString(memoryStream.ToArray()));
            Console.WriteLine();
        }

我的代码如下:

var crypto = require('crypto');
var algorithm = 'aes-128-ecb';
var key = 'RTgklqOuVBZ=';
var iv = '3FH9eyHK7mfgtwF81RIwgA==';
var decipher = crypto.createDecipheriv(algorithm, key,iv);

var data = 'hidden the coded string '
decipher.update(data, 'base64', 'utf8');
var decoded = decipher.final('utf8');
console.log(decoded);

但是在crypto.createDecipheriv(algorithm, key,iv);时,报错,Invalid IV length 。 试了:var iv = new Buffer(‘3FH9eyHK7mfgtwF81RIwgA==’,‘base64’); 也还是报同样的错误,请教一下,是哪里没有设置对?

哪位同学能帮忙搞定,请留下解决方案,愿发50元红包感谢!【已发给@jiangzhuo49.9】

更新: 问题稍微有些复杂,下面是C#在线代码,根本跑不通。 http://www.shucunwang.com/RunCode/csharp/#id/05e22719679f314a9cf729388895fd5d 下面是我用VisualC# 2010 Express版本跑的,可以跑通。 http://note.youdao.com/noteshare?id=6a43445e6c781eba014d0c1ebc6d6e9c 按照@jiangzhuo的办法,也是提醒key太短了,虽然没解决,但是@jiangzhuo提供了大概的问题所在,所以给@jiangzhuo发了49.9的红包。 希望是纯js模块的。

也许@welchwsy提供的crypto-js有效?,我实在研究不明白,还请大家帮忙: 提供代码(非样例代码,而是真的用代码中的key和iv),用纯JS模块(非本地模块),通过测试,将加密过的+hWYuvicr6++J4/DYwf5lw==还原为hello 哪位同学能帮忙搞定,请留下解决方案,愿发100元红包感谢!

23 回复

为啥要转成node代码 直接用C#代码不行吗?

运行时有要求,我其实是想放在nw.js里面去跑。

@ylyxf 我是觉得有现成的C#代码或者dll就不用重复劳动直接使用就好了 edge应该也能直接用在nw.js里 下面的代码在我的mac上能测试通过 https://gist.github.com/jiangzhuo/030f2a636f3499eef51b0a8382ca3382

keyiv 应该先用 base64decode 一下吧?

你应该用这一段代码C#造一个测试用例出来

兄弟你早说啊 我下午就给你写纯js了的 你等着我这吃完饭回家给你写

waiting for you

@jiangzhuo ,要是搞定了,请回帖,我联系你哈!

@ylyxf 哎呀写了一堆没发出去。。 你可以理解成AES是Rijndael的一个子集,AES限制的block的大小和IV的大小,所以你用node api中现成的AES算法是肯定不行的。 具体AES和RijndaelManaged 见下面的网址 https://blogs.msdn.microsoft.com/shawnfa/2006/10/09/the-differences-between-rijndael-and-aes/ http://stackoverflow.com/questions/748622/differences-between-rijndael-and-aes

推荐使用 https://www.npmjs.com/package/mcrypt 这个包,与PHP写的程序加解密的时候经常用,具体代码见我的gist 支付宝账号就是我的邮箱

喜欢楼上挣钱了。

厉害,这么快就抢到红包了。

来晚了,安利一下crypto-js

var C = require("crypto-js");
C.AES.encrypt(C.enc.Hex.parse('your key'), C.enc.Hex.parse('your iv'), { mode: C.mode.ECB, padding: C.pad.NoPadding }).ciphertext.toString())

上午有事情,现在马上验证一下

呃,需要rebuild,cc的代码,目前没有环境,晚上回去验证。

@jiangzhuo , 按照你提供的方案,解决的时候,报如下错误: mc.open(new Buffer(key, ‘base64’), new Buffer(iv, ‘base64’)); ^ TypeError: Invalid key size. Available key size are [16, 24, 32]

@ylyxf 已收到,刚睡醒,数了一下RTgklqOuVBZ=的确不是16或者32或者24长度,至于为啥C# 有的版本认有的版本不认也是有意思,一会儿早晨五点多要去赶飞机,3号左右才能回来,到时候再看看能找出为什么吧。 加密解密这种计算密集的一般大家都用本地代码写,用纯js肯定也能写倒是。

@ylyxf 查了一下,Unhandled Exception: System.Security.Cryptography.CryptographicException: Key is too small(8 bytes), it should be 16, 24 or 32 bytes long.这句话是Mono的代码里的。这大概解释了为什么那个网站在线运行的会报错,大概人家背后是Linux服务器用的Mono执行的代码

查看了微软的mscorlib实现的源码,人家判断了在Key不足的时候的情况 http://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rijndaelmanagedtransform.cs,884 在key长度比块大小小的时候会做处理,但是mono实现的代码就简单很多。

结贴。 用另外一种办法解决了,用C#解密后写入文件,再由nodejs读。 加解密这块,真的不太懂。

回到顶部