javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通

news/2025/1/7 11:20:40/文章来源:https://www.cnblogs.com/ralphlauren/p/18621221

javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission |

| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------|
| 14368775| javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通| 2021-02-03T18:39:00| | BlogPost|

我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋友一些参考。

场景:网页客户端(html)页面通过在发起请求时,将数据加密发送给C#编写的后端。C#后端接受到数据后需要进行解密,解密后得到明文,用明文进行业务操作,操作完成后,将结果加密返回。

因为C#后端使用的是DES CBC模式,所以前端JS也要使用相同的方式。否则加密解密结果不以言,就无法互通了。

 

使用技术:

1.前端javascript 使用CryptoJS进行加解密。

2.使用System.Security.Cryptography 命名空间下的相关类。

前端核心代码:

复制代码
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>JS_DES加解密CBC模式与C#DES加解密相同互通</title><script type="text/javascript">function CBCJiami() {var key = $("#desKey").val();var iv = $("#desIV").val();var msg = $("#source").val();var dd = encryptByDES(msg, key, iv);$("#JiaMiHou").val(dd);$("#target").val(toBase641(dd)); }function CBCJiemi() {            var key = $("#desKey").val();var iv = $("#desIV").val();var msg = $("#JiaMiHou").val();var dd = decryptByDESModeEBC(msg, key, iv);$("#CBCJiemi").val(dd);          }// DES CBC模式加密//加密内容、秘钥、向量function encryptByDES(message, key, iv) {var keyHex = CryptoJS.enc.Utf8.parse(key);var ivHex = CryptoJS.enc.Utf8.parse(iv);encrypted = CryptoJS.DES.encrypt(message, keyHex, {iv: ivHex,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return encrypted.ciphertext.toString();}//DES  CBC模式解密function decryptByDESModeEBC(ciphertext, key, iv) {//把私钥转换成UTF - 8编码的字符串var keyHex = CryptoJS.enc.Utf8.parse(key);var ivHex = CryptoJS.enc.Utf8.parse(iv);// direct decrypt ciphertextvar decrypted = CryptoJS.DES.decrypt({ciphertext: CryptoJS.enc.Hex.parse(ciphertext)}, keyHex, {iv: ivHex,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return decrypted.toString(CryptoJS.enc.Utf8);}//十六进制字符串转为base64function toBase641(input) {var digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var base64_rep = "";var cnt = 0;var bit_arr = 0;var bit_num = 0;for (var n = 0; n < input.length; ++n) {if (input[n] >= 'A' && input[n] <= 'Z') {ascv = input.charCodeAt(n) - 55;}else if (input[n] >= 'a' && input[n] <= 'z') {ascv = input.charCodeAt(n) - 87;}else {ascv = input.charCodeAt(n) - 48;}bit_arr = (bit_arr << 4) | ascv;bit_num += 4;if (bit_num >= 6) {bit_num -= 6;base64_rep += digits[bit_arr >>> bit_num];bit_arr &= ~(-1 << bit_num);}}if (bit_num > 0) {bit_arr <<= 6 - bit_num;base64_rep += digits[bit_arr];}var padding = base64_rep.length % 4;if (padding > 0) {for (var n = 0; n < 4 - padding; ++n) {base64_rep += "=";}}return base64_rep;}</script><script src="jquery-3.4.1.min.js"></script><script src="CryptoJS v3.1.2/rollups/tripledes.js"></script><script src="CryptoJS v3.1.2/components/mode-ecb-min.js"></script><script src="Base64Helper.js"></script>
</head>
<body><div><fieldset><legend>DES CBC模式加密</legend>Key:<input type="text" id="desKey" value="z9j#$@4D"><br />IV:<input type="text" id="desIV" value="x34dg!df"><br />MSG:<input id="source" value="{}" /><br /><input type="button" onclick="CBCJiami();" name="" value="CBC加密" /><br />加密后:<input id="JiaMiHou" value="" /><br />转base64后:<input id="target" value="" /><br /><input type="button" onclick="CBCJiemi();" name="" value="CBC解密" /><br />解密后:<input id="CBCJiemi" value="" /></fieldset></div>
</body>
</html>
复制代码

后端核心代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
 
namespace WindowsFormsTest
{
    public class DESHelper
    {
        /// <summary>
        /// DES加密字符串
        /// </summary>
        /// <param name="encryptString">待加密的字符串</param>
        /// <param name="encryptKey">加密密钥,要求为8位</param>
        /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
        public static string EncryptDES(string encryptString, string encryptKey, string iv)
        {
            try
            {
                //将字符转换为UTF - 8编码的字节序列
                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                byte[] rgbIV = Encoding.UTF8.GetBytes(iv);
                byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                //用指定的密钥和初始化向量创建CBC模式的DES加密标准
                DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                dCSP.Mode = CipherMode.CBC;
                dCSP.Padding = PaddingMode.PKCS7;
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);//写入内存流
                cStream.FlushFinalBlock();//将缓冲区中的数据写入内存流,并清除缓冲区
                return Convert.ToBase64String(mStream.ToArray()); //将内存流转写入字节数组并转换为string字符
            }
            catch
            {
                return encryptString;
            }
        }
 
        /// <summary>
        /// DES解密字符串
        /// </summary>
        /// <param name="decryptString">待解密的字符串</param>
        /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
        public static string DecryptDES(string decryptString, string decryptKey, string iv)
        {
            try
            {
                //将字符转换为UTF - 8编码的字节序列
                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
                byte[] rgbIV = Encoding.UTF8.GetBytes(iv);
                byte[] inputByteArray = Convert.FromBase64String(decryptString);
                //用指定的密钥和初始化向量使用CBC模式的DES解密标准解密
                DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                dCSP.Mode = CipherMode.CBC;
                dCSP.Padding = PaddingMode.PKCS7;
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(mStream.ToArray());
            }
            catch
            {
                return decryptString;
            }
 
 
        }
    }
}

  运行效果:

 

 

 

 

 

 其中要注意一点:前端加密后有个转Base64的操作,加密解密后才会相同,原因是C#加密后的数据是转成base64的。

多说无益,直接上代码: 

链接:https://pan.baidu.com/s/1FqpRa9LGuSfRZ9ZZ7Hau0g
提取码:hjvu

最后感谢网络上我参考过的文章、博客。有的代码是直接抄过来改的,参考太多无法一一列出,但要感谢他们无私精神。

| 648658| | 2024-04-29T20:50:00| false| | 2021-02-03T18:38:32.073| true| 我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋友一些参考。 场景:网页客户端(html)页面通过在发起请求时,将数据加密发送给C#编写的后端。C#| Anonymous|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861896.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJs-11精通着色器编程(重难点)

着色器语言编程比较重要,后面的几个章节都会围绕这个来做特效 一.初识着色器语言 首先什么叫做着色器,他是一种语言,首先需要设置为着色器材质,然后在材质里面书写一些语言,可以告诉他顶点,然后去自定义一些东西,比如我想要这一面为红色等等比如用一个基础材质做了一个平…

2024.12.30 由于不会制表痛失一份工作,学习excel制表

单元格格式可以用来切换其中内容的格式,小技巧,数值右对齐,文字左对齐 单元格内换行输出使用Alt + Enter 在>数据->分列中可以将某个单元格中的数据分成不同的列 1.随机函数 rand()返回一个0-1之间的数字,且图表每次更新都会进行随机 randbetween(low,high)返回一…

关于 IntelliJ IDEA 2024 安装激活使用教程以及常见问题(激活至2026,实际上永久,亲测!)

申明:本教程 IntelliJ IDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 IDEA 首先,如果小伙伴的电脑上有安装老版本的 IDEA , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即…

Docker入门之docker-compose

一,Docker-compose简介 1,Docker-compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件…

『AotuHotKey』——一个小巧却高效的实用效率工具

[!note] 本来主要是想找一下「」和『』,然后这个方法直接可以找到大部分的特殊字符通过输入法输出『Ctr + shift + Z』进入搜狗输入法的『符号大全』在『标点符号』项可以找到「」和『』使用AutoHotKey自定义替换[!note] 每次想要用到这两个符号的时候都要进入输入法的『符号大…

让项目数据一目了然的10款项目管理软件推荐

在当今快节奏的商业环境中,项目管理已经成为企业成功的关键因素之一。无论是小型团队还是大型企业,高效的项目管理工具都能帮助团队更好地规划、执行和监控项目进度。然而,面对市场上琳琅满目的项目管理软件,如何选择一款适合自己团队的工具,往往让人感到困惑。本文将为您…

锁整理--有缺失

// 概述 // 分类// ------------------------------------------------------------------------------------------- // 全局锁 // 对整个数据库加锁,整个实例变为只读状态,后续的dml语句,ddl语句,已经更新操作的事务提交语句都会阻塞 // 应用场景主要是做全库的逻辑备份,…

项目管理证书与敏捷方法论的结合应用

项目管理证书与敏捷方法论的结合应用是当前项目管理领域中一个备受关注的话题。随着项目复杂性和不确定性的增加,传统的项目管理方法在应对快速变化的需求时显得力不从心。敏捷方法论以其灵活性和适应性,逐渐成为项目管理的主流方法之一。然而,项目管理证书如PMP(项目管理专…

六大亮点解析:AI视频监控助力部队训练安全管理

一、用户痛点: 在部队的日常训练和任务执行中,官兵的安全始终是最为重要的保障。然而,传统的监控方式存在显著的局限性,尤其是在高强度、长时间的训练过程中,人工值守监控容易产生疲劳,误判的风险大,难以及时发现隐患。尤其在突发事件发生时,传统监控往往无法做到即时预…

低代码时代:这 9 款项目管理系统,90% 的企业都在用!

在低代码时代,企业对项目管理系统的需求日益增长。项目管理工具种类繁多,涵盖了从传统的项目管理软件到新兴的云平台,其中包括禅道、简道云、明道云、Trello、Teambition、Jira、Redmine、OutSystems、Zoho Projects等。这些工具以其独特的功能和特点,满足了不同企业的项目…

在Lazarus下的Free Pascal编程教程——在程序运行时改变组件的外观

0.前言 我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“…

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(00):iced简单窗口的实现以及在窗口显示中文

本文是系列博客园的第一篇,主要介绍一下基于rust的GUI库iced的简单使用前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍…