详解DES&3DES算法的原理以及C#和JS的实现

详解DES&3DES算法的原理以及C#和JS的实现

DES算法原理

DES全称为Data Encryption Standard,即数据加密标准,是一种对称加密算法。DES算法的输入为64位明文,密钥为56位,经过16轮加密后输出64位密文。DES算法的具体过程如下:

  1. 将64位明文分为左右各32位。
  2. 将右32位作为F函数的输入,同时将左32位作为下一轮的右32位,进行以下操作:

    a. 将右32位通过初始置换表(IP表)的置换得到L1,R1。

    b. 经过16轮加密,形成L16,R16。

    c. 将L16和R16交换位置,得到R16L16。

    d. 将R16L16通过逆置换表(InvIP表)的置换,得到64位密文。

  3. 解密时,同样采用16轮加密,但是密钥需要反过来使用。

3DES算法原理

3DES即Triple DES,是基于DES算法的一种加密算法。它采用3个不同的密钥对数据进行3次加密,提高了加密强度。3DES算法的具体过程如下:

  1. 将明文分为左右各32位。
  2. 采用2个密钥对明文进行DES加密,得到中间结果。
  3. 采用第3个密钥对中间结果进行DES解密,再采用2个密钥对解密结果进行DES加密,得到密文。

C#实现DES算法示例

C#中的DES算法类为System.Security.Cryptography.DES,具体实现过程如下:

using System.Security.Cryptography;

public static string DESEncrypt(string plaintext, string key)
{
    using (var des = DES.Create())
    {
        byte[] keyBytes = Encoding.ASCII.GetBytes(key);
        byte[] plaintextBytes = Encoding.ASCII.GetBytes(plaintext);

        des.Key = keyBytes;
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.PKCS7;

        using (var encryptor = des.CreateEncryptor())
        {
            byte[] ciphertextBytes = encryptor.TransformFinalBlock(plaintextBytes, 0, plaintextBytes.Length);
            return Convert.ToBase64String(ciphertextBytes);
        }
    }
}

JS实现3DES算法示例

JS中没有现成的3DES算法类,需要引入crypto-js库来实现。具体实现过程如下:

import CryptoJS from 'crypto-js';

function TripleDESEncrypt(plaintext, key) {
  let key1 = CryptoJS.enc.Utf8.parse(key.substr(0, 8));
  let key2 = CryptoJS.enc.Utf8.parse(key.substr(8, 8));
  let key3 = CryptoJS.enc.Utf8.parse(key.substr(16, 8));
  let ciphertext = CryptoJS.TripleDES.encrypt(plaintext, key1, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  ciphertext = CryptoJS.TripleDES.decrypt(ciphertext, key2, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  ciphertext = CryptoJS.TripleDES.encrypt(ciphertext, key3, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return ciphertext.ciphertext.toString(CryptoJS.enc.Base64);
}

示例一:C#实现DES加解密

string plaintext = "hello world";
string key = "12345678";

string ciphertext = DESEncrypt(plaintext, key);
Console.WriteLine(ciphertext);

using (var des = DES.Create())
{
    byte[] keyBytes = Encoding.ASCII.GetBytes(key);
    byte[] ciphertextBytes = Convert.FromBase64String(ciphertext);

    des.Key = keyBytes;
    des.Mode = CipherMode.ECB;
    des.Padding = PaddingMode.PKCS7;

    using (var decryptor = des.CreateDecryptor())
    {
        byte[] plaintextBytes = decryptor.TransformFinalBlock(ciphertextBytes, 0, ciphertextBytes.Length);
        string decryptedPlaintext = Encoding.ASCII.GetString(plaintextBytes);
        Console.WriteLine(decryptedPlaintext);
    }
}

输出:

Xa6LNsClKgWSpxT05yk9sA==
hello world

示例二:JS实现3DES加解密

let plaintext = 'hello world';
let key = '123456789012345678901234';

let ciphertext = TripleDESEncrypt(plaintext, key);
console.log(ciphertext);

let decryptedPlaintext = CryptoJS.TripleDES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse(ciphertext) }, CryptoJS.enc.Utf8.parse(key.substr(16, 8)), {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log(decryptedPlaintext);

输出:

jgW4OdV5vhsBX33hz1j9/w==
hello world

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解DES&3DES算法的原理以及C#和JS的实现 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#五类运算符使用表达式树进行操作

    标题:使用表达式树进行C#五类运算符操作的完整攻略 什么是表达式树? 表达式树是将C#语言中的表达式转换为对象模型,可以在运行时分析表达式并进行编译。表达式树不仅可以描述C#语言中的表达式,还可以描述Lambda表达式和LINQ查询表达式。 五类运算符 C#语言中有五类运算符:算术运算符、关系运算符、逻辑运算符、赋值运算符和位运算符。 使用表达式树操作这些运…

    C# 2023年5月15日
    00
  • 探讨如何配置SQL2008,让其允许C#远程外部连接的方法详解

    探讨如何配置SQL2008,让其允许C#远程外部连接的方法: 配置SQL2008的网络设置 打开”SQL Server Configuration Manager”,选择 “SQL Server Network Configuration”,然后选择SQL Server服务的名称。 选择 “TCP/IP” 选项卡。 若TCP/IP未启用,则右键选择 “TCP…

    C# 2023年6月2日
    00
  • C#任务并行Parellel.For和Parallel.ForEach

    我们来详细讲解一下C#中任务并行的两个方法Parallel.For和Parallel.ForEach的使用攻略。 Parallel.For 用法 Parallel.For是C#中的一个并行任务处理方法,可以并行处理一个区间内的多个任务。其语法格式如下: Parallel.For(startIndex, endIndex, index => { // 处…

    C# 2023年6月6日
    00
  • 基于switch你可能不知道的一些用法

    基于switch你可能不知道的一些用法 简介 switch 是 JavaScript 中流程控制语句之一,可以根据指定的表达式的值,在多个代码块中选择执行其中的一个。通常,switch 语句用于代替多个 if 语句的情况。 除了常见的使用场景外,switch 还有一些其他很有用的用法,接下来我们来学习其中几个常用的技巧。 示例一:多个条件匹配 在普通的 sw…

    C# 2023年6月3日
    00
  • 你了解C#的协变和逆变吗,看完这篇就懂了

    C#的协变和逆变是在面向对象里面的类型系统中的概念。在C# 2.0之前,这两个概念是不存在的,开发者只能通过强制类型转换来满足某些需求。在C# 2.0之后,引入了这两个概念,通过它们可以更加安全地进行类型转换,同时也提升了代码的可读性。 一、协变: 协变指的是能够将一个派生类的变量赋值给基类的变量,或者能够将一个方法的返回值类型声明为基类的类型。它的形态如下…

    C# 2023年5月15日
    00
  • C# PictureBox控件方法参数及图片删除重命名上传详解

    C# PictureBox控件方法参数及图片删除重命名上传详解 控件介绍 PictureBox控件是 C#中非常常用的图片显示控件,可以显示多种图片格式的静态图像和动态图像。 常用方法及参数 PictureBox.ImageLocation 属性 该属性可以指定 PictureBox 控件要显示的图像文件的路径,路径可以是绝对路径,也可以是相对于应用程序包含…

    C# 2023年5月15日
    00
  • java servlet结合Oracle搭建java的web开发环境

    javaservlet结合Oracle搭建java的web开发环境 在Java的Web开发中,常常需要使用Java Servlet和Oracle数据库。本文将介绍如何结合Java Servlet和Oracle搭建Java的Web开发环境。 步骤1:安装Oracle数据库 首先,我们需要安装Oracle数据库。可以从Oracle官网下载并安装Oracle数据库…

    C# 2023年5月15日
    00
  • C# GetEnumerator():返回 IEnumerator 对象,它可用于循环访问集合中的元素

    C#中的GetEnumerator()方法可用于实现自定义迭代器。它基本上是 .NET 迭代器的基础,并且为 LINQ 提供了一个极好的风格。 GetEnumerator()方法概述 GetEnumerator()方法返回一个实现了 IEnumerator 接口的对象。这个接口定义了当前集合中某个位置的元素,以及如何在一个集合中移动以访问其他元素。 实现方式…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部