首页 > 编程语言 >C#与Node JS互相实现DES加密解密

C#与Node JS互相实现DES加密解密

时间:2023-05-26 11:45:19浏览次数:53  
标签:Node return string C# alg DES plaintext 加密 ciph

具体的加密算法可以可自行查询其区别,这里只是抛砖引玉,大部分加密方法基本都能通过改变传入参数来实现。

C#相关类文档: System.Security.Cryptography 命名空间 | Microsoft Learn

Node JS相关文档:Crypto | Node.js v16.20.0 Documentation (nodejs.org)

 

C#加密函数:

 1 using System;
 2 using System.ComponentModel;
 3 using System.Security.Cryptography;
 4 using System.Text;
 5 
 6 namespace Hello
 7 {
 8     class HelloWorld
 9     {
10         //默认的加密密钥,不得少于8位,否则会报错
11         private static readonly string key = "password";
12 
13         static void Main(string[] args)
14         {
15             String text = HelloWorld.EncryptString("plaintext", key);
16             string decy = HelloWorld.DecryptString("9M2Z9AqQqdfoURRguzzSAA==", key);
17             Console.WriteLine(text);
18             Console.WriteLine(decy);
19         }
20 
21         //解密算法
22         public static string DecryptString(string decryptString, string decryptKey)
23         {
24             try
25             {
26                 
27                 byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
28                  //初始化偏移向量,因为第一个明文分组没有前一组密文进行异或,所以这里是要有一个初始化向量的 
29                 byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
30                 byte[] inputByteArray = Convert.FromBase64String(decryptString);
31                 using DESCryptoServiceProvider DCSP = new();
32                 MemoryStream mStream = new MemoryStream();
33                 CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
34                 cStream.Write(inputByteArray, 0, inputByteArray.Length);
35                 cStream.FlushFinalBlock();
36                 return Encoding.UTF8.GetString(mStream.ToArray());
37             }
38             catch
39             {
40                 return decryptString;
41             }
42         }
43 
44         //加密算法
45         public static string EncryptString(string encryptString, string encryptKey)
46         {
47             try
48             {
49                 byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
50                 byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
51                 byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
52                 using DESCryptoServiceProvider DCSP = new();
53                 MemoryStream mStream = new MemoryStream();
54                 CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
55                 cStream.Write(inputByteArray, 0, inputByteArray.Length);
56                 cStream.FlushFinalBlock();
57                 return Convert.ToBase64String(mStream.ToArray());
58             }
59             catch
60             {
61                 return encryptString;
62             }
63         }
64     }
65 }   

 

控制台输出为

 

Node JS加密函数为:

 1 const key = 'password'
 2 const arr = [0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]
 3 const iv = Buffer.from(arr)
 4 
 5 /**
 6  * des-cbc加密函数
 7  * @param plaintext 原文
 8  * @param alg 加密方式,这里统一用cbc加密
 9  * @returns {string} 密文
10  */
11 function encrypt(plaintext, alg) {
12     //创建加密对象,参数为
13     //加密方式(string), 密钥(string), 初始向量(ArrayBuffer,二进制数组)
14     let cipher = crypto.createCipheriv(alg, key, iv);
15 
16     //自动填充,否则输入长度不为密码块的倍数时会报错
17     cipher.setAutoPadding(true);
18 
19     //用加密对象进行加密,参数为
20     //data: 原始数据,一般为string,其他类型则忽略输入类型
21     //inputencoding: 数据的输入编码方式,这里转换为unicode
22     //outputencoding: 数据的输出编码方式,这里是用base64,其特点是存在非3倍数时末尾会出现'='
23     //return:返回加密密文,类型为string
24     let ciph = cipher.update(plaintext, 'utf8', 'base64');
25 
26     //将剩余内容全部进行加密并返回总结果,因为上面的一次只能加密部分数据
27     ciph += cipher.final('base64')
28     return ciph
29 }
30 
31 /**
32  * des-cbc解密数据
33  * @param ciphertext 密文
34  * @param alg 解密方式
35  * @returns {string} 原文
36  */
37 function decrypt(ciphertext, alg) {
38     //解码失败则返回空,因为有些早期数据没有密码
39     if(!ciphertext) return ''
40     let dcipher = crypto.createDecipheriv(alg, key, iv);
41     dcipher.setAutoPadding(true);
42     let ciph = dcipher.update(ciphertext, 'base64', 'utf8');
43     ciph += dcipher.final('utf8')
44     return ciph
45 }

//调用
console.log(encrypt('plaintext', 'des-cbc'))
console.log(decrypt('9M2Z9AqQqdfoURRguzzSAA==', 'des-cbc'))

控制台输出为:

 注意:因为JS中不存在二进制数据类型,因此需要用到Buffer来转换。基本语法都是这样,若要其他加密算法以及编码方式,则更改对应参数即可,譬如

encrypt('plaintext', 'des-cfb') //cfb加密

let ciph = cipher.update(plaintext, 'utf8', 'hex'); //hex编码方式

 

个人笔记记录。

 

标签:Node,return,string,C#,alg,DES,plaintext,加密,ciph
From: https://www.cnblogs.com/ricardox3/p/17434333.html

相关文章

  • 异步编程(Thread、ThreadPool、Task、异步关键字async/await)
    一、什么是异步Thread,是微软.Net1.0推出;ThreadPool 是微软.Net2.0推出;Task是微软.Net4.0推出;async/await是微软.Net5.0推出;       同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方......
  • JS逆向实战14——猿人学第二题动态cookie
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标网站https://match.yuanrenxue.cn/match/2网站分析首先已经告诉了我们这个网站是动态cookie,所以......
  • Kioxia将在台北国际电脑展上展示提供PCIe® 4.0性能的新款消费级固态硬盘
    全球内存解决方案领导者KioxiaCorporation今日宣布,该公司计划于2023年第三季度发布新的消费级固态硬盘(SSD)。EXCERIAPLUSG3系列将运用PCIe®4.0技术,并提供高达2TB的容量。新系列产品非常适合高性能游戏PC、台式机和笔记本的主流用户,为他们带来所需的速度和低成本。5月30日至6月......
  • BOSHIDA DC电源模块的主要作用与应用
    BOSHIDADC电源模块的主要作用与应用DC电源模块是一种电源转换器件,作用是将输入电源的直流电压转换为稳定的输出直流电压,以供电子器件使用。DC电源模块主要作用是将交流电源转换为直流电源,为电子设备提供稳定的直流电源。它可以在各种电子设备和电路中,如通信设备、工业控制、计算......
  • Docker - 安装tomcat
     搜索tomcat镜像dockersearchtomcat拉取镜像dockerpulltomcat:[tag]拉取tomcat8dockerpulltomcat:8运行容器dockerrun-d-p8080:8080--nametomcat_hellotomcat:8-d:以后台方式运行-p:8080:8080:端口映射到主机的8080端口--name:将容器命名为tomcat_hello访问界......
  • c#读写锁浅记录
    publicclassC{staticprivateReaderWriterLockSlimrwl=newReaderWriterLockSlim();publicstaticvoidMain(){Threadt_read1=newThread(newThreadStart(WriteSomething));t_read1.Start();Console.WriteLine("{0}C......
  • 深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick
    深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、TransformerEncoder等原理详细讲解1.XLNet:GeneralizedAutoregressivePretrainingforLanguageUnderstanding1.1.从AR和AE模型到XLNet模型自回归模型(AutoregressiveModel,AR),通过估计......
  • RUBY-FLEX实践—利用swfobject在RUBY工程中加载SWF
    开发环境:Ruby:Ruby1.9.1Rails:Rails2.3.5IDE:RubyMine2.0.1FlexBuilder:FlexBuilder4 开发思路:1)在FlexBuilder中创建Flex工程2)在RubyMine中创建Rails工程3)将Flex工程bin-debug下编译的swfobject.js拷贝至Ruby工程指定位置4)引用Flex工程编译后的html中的内容实现在Rails页面中嵌......
  • FLEX4实践—DropDownList与ComboBox
    FLEX4相对FLEX3的组件变化列表中列出以这么一项:mx.controls.ComboBox->spark.components.DropDownList 官方解释如下:   ComboBox控件是DropDownListBase控件的子类。与DropDownListBase控件类似,当用户从ComboBox控件的下拉列表中选择某项时,数据项将显示在......
  • C++中extern "C"的使用
    由上一篇博客知识可得,C++中对符号表中符号的生成方式是不一样的,所以我们需要一种兼容方式处理他们上篇博客地址:https://www.cnblogs.com/woodx/p/17434227.html 但是如果我们需要沿用C的代码,需要链接静态库或动态库的时候,是不是会发生冲突呢 因此需要提前声明extern"C" ......