详解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日

相关文章

  • unity AudioSource播放完声音后要执行的函数或条件操作

    Unity AudioSource播放完声音后要执行的函数或条件操作 在Unity中,我们可以使用AudioSource来播放声音。但是有些时候,我们需要在声音播放完毕后执行一些函数或条件操作,例如弹出一个对话框或者播放下一个音频。 下面是关于如何实现在AudioSource播放完声音后执行函数或条件操作的完整攻略。 步骤一:编写脚本 首先,我们需要编写一个…

    C# 2023年6月3日
    00
  • 使用ASP.NET MVC引擎开发插件系统

    使用ASP.NET MVC引擎开发插件系统是一种扩展性很强的架构设计,在MVC模式基础上实现插件的动态加载和卸载,可以灵活地引入第三方功能模块,并且不会对系统的稳定性和性能造成太大影响。下面我们将详细讲解如何使用ASP.NET MVC引擎开发插件系统。 一、概述 1.1 插件系统的基本思路 插件系统的基本思路是开发一些模块化的代码,通常来说会使用MVC架构来…

    C# 2023年5月31日
    00
  • 一文带你了解.Net基于Threading.Mutex实现互斥锁

    .NET基于Threading.Mutex实现互斥锁攻略 在多线程编程中,互斥锁是一种常用的同步机制,用于保护共享资源的访问。在.NET中,我们可以使用Threading.Mutex类来实现互斥锁。本攻略将介绍如何使用Threading.Mutex类实现互斥锁。 步骤 以下是使用Threading.Mutex类实现互斥锁的步骤: 创建Mutex实例。 使用M…

    C# 2023年5月17日
    00
  • C#通过不安全代码看内存加载的示例详解

    让我来给大家详细讲解一下“C#通过不安全代码看内存加载的示例详解”的完整攻略。 标题 在开始之前,我们需要给这篇攻略一个标准的标题。根据通常的写作规范,一个良好的标题应该简洁、直观、准确地表达文章的主要内容。因此,我们可以采用如下的格式来给这篇攻略取一个合适的标题: C#通过不安全代码看内存加载的示例详解 内容 在正式讲解之前,我们需要了解一下什么是不安全代…

    C# 2023年5月15日
    00
  • WPF实现钟表效果

    下面我会为你详细讲解“WPF实现钟表效果”的完整攻略。 一、准备工作 1. 新建WPF应用程序 首先,我们需要新建一个WPF应用程序。 2. 引用PresentationCore、PresentationFramework、WindowsBase三个文件 在新建的WPF应用程序中,我们需要添加 PresentationCore、PresentationFra…

    C# 2023年6月1日
    00
  • C# 表达式目录树Expression的实现

    下面就是关于C#表达式目录树(Expression)的实现攻略。 什么是C#表达式目录树(Expression)? C#表达式目录树(Expression)是一种编程语言特性,用于表示特定语言结构的树形数据结构。它是.NET框架中的一个重要组件,用于功能扩展、动态代码生成和编程语言实现等方面。 C#表达式目录树(Expression)的实现 创建表达式 首先…

    C# 2023年6月1日
    00
  • .net如何优雅的使用EFCore实例详解

    以下是关于“.NET如何优雅地使用EFCore实例详解”的完整攻略: 1. 什么是EFCore? EFCore是.NET平台上的一个ORM(对象关系映射)框架,它可以将数据库中的数据映射到.NET对象中,使得开发人员可以使用.NET对象来操作数据库,而不必直接操作数据库。 2. 如何使用EFCore? 在.NET中,可以使用EFCore来操作数据库。可以按照…

    C# 2023年5月12日
    00
  • C# interface与delegate效能比较的深入解析

    让我来为你详细讲解“C# interface与delegate效能比较的深入解析”的完整攻略。 1. 前言 在 C# 中,接口(interface)和委托(delegate)是基础的编程技术特性。在一些时候,它们可以被很有效地用于达到相同的目的。 在本文中,我们将对它们进行深度对比,分析它们之间的性能差异和适用场景,并展示两个示例来说明它们的性能差异。 2.…

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