使用 JavaScriptService 在.NET Core 里实现DES加密算法
文章《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加密算法相关推荐
- 程会玩 | 在.NET Core里操作Git
点击上方蓝字关注"汪宇杰博客" Git是很多程序员的首选源代码版本控制工具,我最近也从TFVC切换到了Git,受益匪浅.今天我就来带大家看看如何在.NET Core里操作Git. ...
- 用ABP只要加人即可马上加快项目进展(二) - 分工篇 - BDD实战篇 - .NET Core里跑Specflow...
这是<如何用ABP框架快速完成项目 >系列中的一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 上一篇文章说了如何在.NET Core里安装Specflow. 然而文章成果 ...
- 分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法
1 介绍 1.1 DES对称加密算法介绍 对称加密算法 通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成.通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥 ...
- DES 加密算法的实现
概述 DES加密算法,算是密码学里入门的知识了,前段时间有兴趣搞了一下,但是没有做完.现在桌面实在是东西太多了,暂且丢到博客里,以后有空再来改一下. 一共三个文件: data.h 各种表组成的头文件 ...
- DES加密算法安全性评估
DES加密算法应用误区 DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法.而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种 ...
- 算法科普:神秘的 DES 加密算法
1 前言 DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出.DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法.本文将详细讲述DES 的原理以及实现过程. 1. ...
- des加密算法python代码_python des加密算法代码(pydes模块加密)
python加密解密模块:pyDES模块,用来提供 DES.Triple-DES 的加密算法. 专题教程: DES加密算法,DES加密解密 python des加密解密算法 例子,Python DES ...
- destools php_php DES加密算法实例分析
本文实例讲述了php DES加密算法.分享给大家供大家参考,具体如下: yii框架的DES代码 /** *@see Yii CSecurityManager; */ class Des{ public ...
- 证明:DES解密算法是DES加密算法的逆
证明: 由于DES算法是在Feistel网络结构的输入和输出阶段分别初始置换IP和初始逆置换IP-1而构成的,其余DES和Feistel相同,IP和IP–1互逆.所以只需证明Feistel解密算法和加 ...
最新文章
- 技术图文:如何理解C#的internal限制修饰符?
- EJSS: 南土所梁玉婷组-生境决定了土壤植物系统中细菌、抗性基因和可移动元件间的关系...
- python装饰器简单理解
- 删库跑路大神的一生:曾在家造炸弹被捕,现卖房押宝NFT,原是开源创业之星...
- lintcode: k Sum 解题报告
- java命令修改user.home file.encoding等参数值
- linux防火墙常用缩写,Linux iptables常用防火墙规则
- php代码上线,实现版本切换
- 前端学习(1902)vue之电商管理系统电商系统之渲实现添加用户前的预先校验
- PHP 结合redis实现高并发下抢购、秒杀
- jvm 内存溢出 Java heap space 调优解决过程
- vscode使用svn插件
- 基于单片机的智能密码锁设计
- 通信电子线路——课程介绍
- 语音识别使用推荐(讯飞、百度、腾讯、云知声等)
- 为什么程序员做外包会被瞧不起
- 网站性能优化三大策略
- 微信会员php源码,基于ThinkPHP框架开发的在线微信拼车系统完整PHP源码-深蓝源码会员专享...
- 智能运动鞋方案/案列/APP/小程序/网站
- XAPP1052理解
热门文章
- 学习xss的一些记录(一)
- 第十一周项目3-程序的多文件组织
- CALL FOR DUTY 来和我们一起冒险吧!
- 共享内存 Actor并发模型到底哪个快?
- FreeSql使用WithSql+ ToSQL 查询数据
- ElasticSearch+NLog实现.net core分布式日志管理
- [Abp 源码分析]ASP.NET Core 集成
- Prism for WPF 搭建一个简单的模块化开发框架
- 别“躺”着了,赶紧把「复盘」做起来
- 秋天 | 等疫情过后,我们继续背起相机去旅行