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

相关文章

  • asp.net core 获取 MacAddress 地址方法示例

    ASP.NET Core获取MacAddress地址方法示例攻略 在ASP.NET Core应用程序中,我们可能需要获取计算机的MacAddress地址。本攻略将介绍如何使用C#代码获取MacAddress地址。 步骤 以下是获取MacAddress地址的步骤: 引用System.Net.NetworkInformation命名空间。 使用System.Ne…

    C# 2023年5月17日
    00
  • C#类继承中构造函数的执行序列示例详解

    以下是“C#类继承中构造函数的执行序列示例详解”的完整攻略。 1. 构造函数的执行序列 在C#中,当一个派生类(子类)的对象被创建时,其继承树上所有基类(父类)中的构造函数也会被调用。构造函数的调用顺序如下: 调用基类的构造函数 执行派生类自身的构造函数 下面通过示例来详细讲解: public class BaseClass { public BaseCla…

    C# 2023年6月7日
    00
  • C#中Convert.ToDecimal()报错问题的解决

    下面我将详细讲解“C#中Convert.ToDecimal()报错问题的解决”的完整攻略,包含以下几个部分: 问题描述 原因分析 解决方法 示例演示 1. 问题描述 在C#中使用Convert.ToDecimal()方法将字符串转为十进制数时,有时候会遇到报错的情况,具体错误信息如下: System.FormatException: 字符串“str”格式不正…

    C# 2023年5月15日
    00
  • 浅析C#中的Main(String[] args)参数输入问题

    浅析C#中的Main(String[] args)参数输入问题 在C#中,我们通常会使用Main方法作为程序的入口点,此方法的输入参数一般表示程序启动时传递给程序的命令行参数。本文将深入浅出,对C#中的Main方法参数输入问题进行探讨。 Main方法定义 在C#中,Main方法通常定义为静态方法,其格式如下: static void Main(string[…

    C# 2023年5月15日
    00
  • C# 分支与循环介绍

    C#分支与循环介绍 在C#中,分支与循环结构是编写程序中十分常见的语法,能够实现程序流程控制,对于实现各种业务逻辑非常重要。本文将详细介绍C#中分支与循环的使用方法。 分支结构 C#中的分支结构主要包括 if/else 语句和 switch 语句。 if/else 语句 if/else 语句是一种基本的条件判断结构,通过判断指定的条件是否满足来决定程序执行的…

    C# 2023年5月15日
    00
  • C#字符串自增自减算法详解

    C#字符串自增自减算法详解 1. 什么是字符串自增自减? 在C#中,字符串类型是不可变的(Immutable),因此操作字符串时需要创建新的字符串对象。而自增自减操作通常被理解为对变量的值进行加1或减1的操作,但对于字符串类型,其并不支持对字符串进行类似于数值类型的自增自减操作。 但是,我们可以通过一些方法实现对字符串的自增自减操作,例如在字符串后面加上“+…

    C# 2023年6月8日
    00
  • C#操作进程的方法介绍

    C# 操作进程的方法介绍 C# 中可以通过 Process 类来实现对进程的操作,包括启动进程、杀死进程、查找进程等。 以下是常用的操作进程的方法: 启动进程 启动新进程可以使用 Process.Start 方法,该方法返回一个 Process 对象,通过该对象可以得到该进程的一些详细信息,比如进程 ID,句柄等。 以下示例代码演示了如何启动计算器程序: u…

    C# 2023年6月7日
    00
  • Asp.Net 动态页面转静态页面主要代码

    Asp.Net 动态页面转静态页面的主要代码可以分为以下三个步骤: 定义Route规则 在Global.asax.cs文件中的Application_Start方法中添加Route规则,将动态页面的URL地址与对应的Controller及Action方法进行绑定。例如下方的示例定义了将URL地址为”/article/{id}”的动态页面绑定到了HomeCon…

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