文章《ASP.NET Core loves JavaScript》和《跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题》为我们扩展.NET Core的API提供了一套解决方案,上周在看.NET的加解密算法发现目前为止没有包括DES算法,github上在才刚刚加入,具体可以看 https://group.cnblogs.com/topic/75273.html 。

Node.js的Crypto库就提供各种加密算法,可以非常方便地让我们使用密码技术,解决应用开发中的问题。Crypto库是随Nodejs内核一起打包发布的,主要提供了加密、解密、签名、验证等功能。Crypto利用OpenSSL库来实现它的加密技术,它提供OpenSSL中的一系列哈希方法,包括hmac、cipher、decipher、签名和验证等方法的封装。Crypto官方文档:http://nodejs.org/api/crypto.html, 博客文章http://blog.fens.me/nodejs-crypto/ 写的非常详细。本文介绍如何使用Crypto的DES算法就可以帮助我们实现立即可用的DES算法。

1、我们参照官方文档 https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.NodeServices#microsoftaspnetcorenodeservices,我们创建一个.NET Core Console应用程序 DotNETNodeApp,添加Microsoft.AspNetCore.NodeServices 包引用:

Install-Package Microsoft.AspNetCore.NodeServices –Pre

2、配置环境,.NET Core默认都是采用的依赖注入模式,我们在这个JavaScriptService中间件也有需求使用到依赖注入,具体参考dudu的文章:在.NET Core控制台程序中使用依赖注入

IServiceCollection services = new ServiceCollection();
//注入
services.AddNodeServices(options =>
{
    options.ProjectPath = @"C:\Users\geffz\Documents\visual studio 2015\Projects\DotNETNodeApp\src\DotNETNodeApp";
    options.WatchFileExtensions = new[] { ".js", ".sass" };
    // ... etc. - see other properties below
});

//构建容器
IServiceProvider serviceProvider = services.BuildServiceProvider();
INodeServices nodeServices = serviceProvider.GetRequiredService<INodeServices>();

3、我们在项目创建一个Node文件夹,然后添加一个cryptUtil.js, 文件内容如下:

var crypto = require('crypto');

module.exports = {
    encrypt: function (callback,plaintext, key,iv) {
        var ecb =  'des-ecb';
        var enkey = new Buffer(key);
        var eniv = new Buffer(iv ? iv : 0);
        var cipher = crypto.createCipheriv(ecb, enkey, eniv);
        cipher.setAutoPadding(true)  //default true
        var ciph = cipher.update(plaintext, 'utf8', 'base64');
        ciph += cipher.final('base64');
        callback(null /* error */, ciph);
    },

decrypt: function (callback, encrypt_text,key, iv) {
      var ecb =  'des-ecb';
      var dekey = new Buffer(key);
        var deiv = new Buffer(iv ? iv : 0);
        var decipher = crypto.createDecipheriv(ecb, dekey, deiv);
        decipher.setAutoPadding(true);
        var txt = decipher.update(encrypt_text, 'base64', 'utf8');
        txt += decipher.final('utf8');
        callback(null, txt);
    }
};

这里有有个JS函数,它将在.NET 程序中被调用,通过传入一个 Node风格的回调函数和三个参数来计算结果。在NodeJS中,一个 JS 文件即代表一个模块,module.exports的意思是把当前函数作为一个对象提供出去以供调用,我们这里有两个函数分别代表加密/解密。

4、创建一个Des 类封装NodeJs的函数调用:

using Microsoft.AspNetCore.NodeServices;
using System.Threading.Tasks;

namespace DotNETNodeApp
{
    public class Des
    {
        private INodeServices nodeServices;

public Des(INodeServices nodeServices)
        {
            this.nodeServices = nodeServices;
        }

public async Task<string> EncryptDES(string data, string key, int iv)
        {
            var result = await nodeServices.InvokeExportAsync<string>("./Node/cryptUtil", "encrypt", data, key, iv);
            return result;
        }

public async Task<string> DecryptDES(string data, string key, int vi)
        {
            var result = await nodeServices.InvokeExportAsync<string>("./Node/cryptUtil", "decrypt", data,key , vi);
            return result;
        }
    }
}

我们再看一下InvokeExportAsync<T>(``),他是一个异步的方法,通过传入一个node.js脚本文件(模块),三个形参来得到一个结果。

方法签名:InvokeExportAsync<T>(string moduleName, string exportName, params object[] args)

5、我们在控制台里测试下我们的封装效果

Des desUtil = new Des(nodeServices);
            string data = "geffzhang";
            string key = "12345678";

string temp = desUtil.EncryptDES(data, key, 0).Result;
            Console.WriteLine(temp);
            string end = desUtil.DecryptDES(temp,key,0).Result;
            Console.WriteLine(end);
            Console.Read();

6、这样使用的性能如何呢,我们用性能测试组件BenchmarkDotNet看下性能数据,使用方法参考 .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono:我们创建一个类DesBenchmark,在方法中加入Benchmark 特性

using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.NodeServices;
using System;
using Microsoft.Extensions.DependencyInjection;
using BenchmarkDotNet.Running;

namespace DotNETNodeApp
{
    public class DesBenchmark
    {
        private IServiceCollection services;
        private IServiceProvider serviceProvider;
        private INodeServices nodeServices;

public DesBenchmark()
        {
            IServiceCollection services = new ServiceCollection();
            //注入
            services.AddNodeServices(options =>
            {
                options.ProjectPath = @"C:\Users\geffz\Documents\visual studio 2015\Projects\DotNETNodeApp\src\DotNETNodeApp";
                options.WatchFileExtensions = new[] { ".js", ".sass" };
                // ... etc. - see other properties below
            });

//构建容器
            serviceProvider = services.BuildServiceProvider();
            nodeServices = serviceProvider.GetRequiredService<INodeServices>();
        }

private string data = "geffzhang"; 
        private string encryData = "uTRLyNkKTaFUxmJtHPlYoA==";
        private string key = "12345678";

[Benchmark]
        public string EncryptDES()
        {
            Des desUtil = new Des(nodeServices);
            return desUtil.EncryptDES(data, key, 0).Result;
        }

[Benchmark]
        public string DecryptDES()
        {
            Des desUtil = new Des(nodeServices);
            return desUtil.EncryptDES(encryData, key, 0).Result;
        }

}
}

下面是控制台输出的结果,性能还是不错的

相关文章:

  • ASP.NET Core loves JavaScript

  • 跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题

  • 用BenchmarkDotNet给C#程序做性能测试

原文地址:http://www.cnblogs.com/shanyou/p/6014352.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

赞赏

人赞赏

使用 JavaScriptService 在.NET Core 里实现DES加密算法相关推荐

  1. 程会玩 | 在.NET Core里操作Git

    点击上方蓝字关注"汪宇杰博客" Git是很多程序员的首选源代码版本控制工具,我最近也从TFVC切换到了Git,受益匪浅.今天我就来带大家看看如何在.NET Core里操作Git. ...

  2. 用ABP只要加人即可马上加快项目进展(二) - 分工篇 - BDD实战篇 - .NET Core里跑Specflow...

    这是<如何用ABP框架快速完成项目 >系列中的一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 上一篇文章说了如何在.NET Core里安装Specflow. 然而文章成果 ...

  3. 分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法

    1 介绍 1.1 DES对称加密算法介绍 对称加密算法 通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成.通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥 ...

  4. DES 加密算法的实现

    概述 DES加密算法,算是密码学里入门的知识了,前段时间有兴趣搞了一下,但是没有做完.现在桌面实在是东西太多了,暂且丢到博客里,以后有空再来改一下. 一共三个文件: data.h 各种表组成的头文件 ...

  5. DES加密算法安全性评估

    DES加密算法应用误区 DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法.而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种 ...

  6. 算法科普:神秘的 DES 加密算法

    1 前言 DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出.DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法.本文将详细讲述DES 的原理以及实现过程. 1. ...

  7. des加密算法python代码_python des加密算法代码(pydes模块加密)

    python加密解密模块:pyDES模块,用来提供 DES.Triple-DES 的加密算法. 专题教程: DES加密算法,DES加密解密 python des加密解密算法 例子,Python DES ...

  8. destools php_php DES加密算法实例分析

    本文实例讲述了php DES加密算法.分享给大家供大家参考,具体如下: yii框架的DES代码 /** *@see Yii CSecurityManager; */ class Des{ public ...

  9. 证明:DES解密算法是DES加密算法的逆

    证明: 由于DES算法是在Feistel网络结构的输入和输出阶段分别初始置换IP和初始逆置换IP-1而构成的,其余DES和Feistel相同,IP和IP–1互逆.所以只需证明Feistel解密算法和加 ...

最新文章

  1. 技术图文:如何理解C#的internal限制修饰符?
  2. EJSS: 南土所梁玉婷组-生境决定了土壤植物系统中细菌、抗性基因和可移动元件间的关系...
  3. python装饰器简单理解
  4. 删库跑路大神的一生:曾在家造炸弹被捕,现卖房押宝NFT,原是开源创业之星...
  5. lintcode: k Sum 解题报告
  6. java命令修改user.home file.encoding等参数值
  7. linux防火墙常用缩写,Linux iptables常用防火墙规则
  8. php代码上线,实现版本切换
  9. 前端学习(1902)vue之电商管理系统电商系统之渲实现添加用户前的预先校验
  10. PHP 结合redis实现高并发下抢购、秒杀
  11. jvm 内存溢出 Java heap space 调优解决过程
  12. vscode使用svn插件
  13. 基于单片机的智能密码锁设计
  14. 通信电子线路——课程介绍
  15. 语音识别使用推荐(讯飞、百度、腾讯、云知声等)
  16. 为什么程序员做外包会被瞧不起
  17. 网站性能优化三大策略
  18. 微信会员php源码,基于ThinkPHP框架开发的在线微信拼车系统完整PHP源码-深蓝源码会员专享...
  19. 智能运动鞋方案/案列/APP/小程序/网站
  20. XAPP1052理解

热门文章

  1. 学习xss的一些记录(一)
  2. 第十一周项目3-程序的多文件组织
  3. CALL FOR DUTY 来和我们一起冒险吧!
  4. 共享内存 Actor并发模型到底哪个快?
  5. FreeSql使用WithSql+ ToSQL 查询数据
  6. ElasticSearch+NLog实现.net core分布式日志管理
  7. [Abp 源码分析]ASP.NET Core 集成
  8. Prism for WPF 搭建一个简单的模块化开发框架
  9. 别“躺”着了,赶紧把「复盘」做起来
  10. 秋天 | 等疫情过后,我们继续背起相机去旅行