C# implements DES encryption algorithm, and the .net class library encapsulates the corresponding classes for various encryption algorithms (symmetric and asymmetric). Data Encryption Standard (DES) is a symmetric encryption algorithm that allows senders and receivers to use the same key to encrypt and decrypt data.
![C# implements DES encryption algorithm 1 C# runs cmd to output messages in real time](https://znlive.com/wp-content/uploads/2022/06/image-2-1024x501.png)
DES was developed by IBM in 1975. It is considered an insecure algorithm due to its 56-bit key size and 64-bit block size. However, its successor, Triple DES (3DES), is secure. TripleDES applies the DES algorithm 3 times on each block. No, the author of jexus has completely implemented the DES encryption algorithm in C# a few days ago, and friends who need to copy it themselves.
C# implements DES encryption algorithm
The DES encryption call method and results are still shown in the figure above.
![C# implements DES encryption algorithm 2 C# implements DES encryption algorithm](https://img.hotbests.com/2022/07/des-result.jpg)
var text = "江湖人士(https://jhrs.com)是一个关注IT科技动态、技术经验分享、WordPress网站建设、wealthy affiliate 中文教程、国外最便宜域名、国外最便宜vps、网赚教程、国外网赚、网赚联盟、国外联盟营销、adsense 赚钱教程、养育小孩、游戏攻略、美女图片、热门美剧、以及分享赚被动收入的网站。"; var key = "key is:jhrs.com"; var des = new DES(Encoding.Default); var desText = des.Encrypt(text, key); Console.WriteLine("加密前的文本:{0}", text); Console.WriteLine("*DES加密密钥:{0}", key); Console.WriteLine("*DES加密结果:{0}", desText); Console.WriteLine("解密后的文本:{0}", des.Decrypt(desText, key)); Console.WriteLine(); Console.WriteLine("press any key to exit"); Console.ReadKey(true);
C# implements DES encryption
C# implements the DES encryption algorithm call result:
加密前的文本:江湖人士(https://jhrs.com)是一个关注IT科技动态、技术经验分享、WordPress网站建设、wealthy affiliate 中文教 程、国外最便宜域名、国外最便宜vps、网赚教程、国外网赚、网赚联盟、国外联盟营销、adsense 赚钱教程、养育小孩、游戏攻略、美 女图片、热门美剧、以及分享赚被动收入的网站。
*DES加密密钥:key is:jhrs.com
*DES加密结果:EDDCABF2E481C3E9E750F4C14D3810452382970F876322217A8183642420184327531CA8A7A32A0AA3D3E5262C3D4DC5A3C163D0E388F7C999F50EBD2BC0DDFA64391E7025AEDE8DFD7239A7B5995A800DB3FE6C28DBC2536C110873F2AD8741815E8CBF102C21211296729CEFE1EA219871117B2E266880CFB4A2508919152D2BFBD73081BE7AE3DF9B72D3E9F2E75C5CADD8FA9A8DF3C38ACC62A614C1A2D2B1AD8B1CAD6D859A5CADD8FA9A8DF3C30C3E79477B8A76E6A64535896C4352C6E34E94597AFD200CB09148C83735A4B456EC5F185A3736D16CB79A3AF464B71337BAB7292AF88B68A9846A8970AEF29EEF6317A9C039D18653B3C42631D9AF321340E09B4C292643217C56D7328F7E463B77CFA2F2A30E5C4469AEB20A19181FDF1EC1476F710CF8084E9DCB51D42E67B6584B878DC9CC6300F795C8ECAB8D4139E274EF0797419BC39CF7BD0914764710463E9A6B91CACF9897A8E94E7F1618707E9E40FFCAECBF4272FD452BD4EAC48387A976D22671B7
解密后的文本:江湖人士(https://jhrs.com)是一个关注IT科技动态、技术经验分享、WordPress网站建设、wealthy affiliate 中文教 程、国外最便宜域名、国外最便宜vps、网赚教程、国外网赚、网赚联盟、国外联盟营销、adsense 赚钱教程、养育小孩、游戏攻略、美 女图片、热门美剧、以及分享赚被动收入的网站。press any key to exit
C# implements DES encryption
![C# implements DES encryption algorithm 3 What is the simplest C# code to copy directory?](https://znlive.com/wp-content/uploads/2022/06/image-4-1024x535.png)
C# DES Encryption Source Code
C# implements DES encryption source code:
/******************************************** * C# implementation of DES encryption and decryption * --------------------------------------- * Author: Yunei Liuyun (j66x@163.com), 2022.6.22 * Special Note: Please do not modify the author's signature, be a person who values trust and righteousness! *****************************************/ namespace System.Text { using System.Runtime.CompilerServices; /// <summary> /// DES encryption and decryption class /// </summary> public sealed class DES { #region <definition> #region <enum definition> enum DES_TYPE { /// <summary> /// encryption /// </summary> ENCRYPT, /// <summary> /// decrypt /// </summary> DECRYPT }; #endregion #region <table definition> static readonly byte[] ip_table = new byte[64] { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; readonly static byte[] ipr_table = new byte[64] { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; readonly static byte[] e_table = new byte[48] { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 }; readonly static byte[] p_table = new byte[32] { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 }; readonly static byte[] pc1_table = new byte[56]{ 57,49,41,33,25,17,9,1, 58,50,42,34,26,18,10,2, 59,51,43,35,27,19,11,3, 60,52,44,36,63,55,47,39, 31,23,15,7,62,54,46,38, 30,22,14,6,61,53,45,37, 29,21,13,5,28,20,12,4 }; readonly static byte[] pc2_table = new byte[48] { 14,17,11,24,1,5,3,28, 15,6,21,10,23,19,12,4, 26,8,16,7,27,20,13,2, 41,52,31,37,47,55,30,40, 51,45,33,48,44,49,39,56, 34,53,46,42,50,36,29,32 }; readonly static byte[] loop_table = new byte[16] { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; readonly static byte[,,] s_box = new byte[8, 4, 16] { //s1 { { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 }, { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 }, { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 } }, //s2 { { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 }, { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 }, { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 }, { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 } }, //s3 { { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 }, { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 }, { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 }, { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 } }, //s4 { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 }, { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 }, { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 }, { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } }, //s5 { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 }, { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 }, { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 }, { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 } }, //s6 { { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 }, { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 }, { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 }, { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 } }, //s7 { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 }, { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 }, { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 }, { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } }, //s8 { { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 }, { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 }, { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 }, { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } } }; #endregion #region <Variable/Constant Definition> /// <summary> /// default key /// </summary> const string KEY_DEFAULT = "YUNEI.LIUYUN"; /// <summary> /// original character set /// </summary> private readonly Encoding _encoding = Encoding.Default; #endregion #endregion #region <internal method> /// <summary> /// Encryption/decryption (input/output buffers are both 8 bytes) /// </summary> /// <param name="lp_out">output</param> /// <param name="lp_in">enter</param> /// <param name="type"></param> /// <param name="subkey"></param> /// <param name=""></param> static unsafe void DesRun(byte* lp_out, byte* lp_in, DES_TYPE type, byte* subkey) { var m = stackalloc byte[64]; var tmp = stackalloc byte[32]; var li = m + 0; var ri = m + 32; ByteToBit(m, lp_in, 64); Transform(m, m, ip_table, 64); if (type == DES_TYPE.ENCRYPT) { for (int i = 0; i < 16; i++) { MemCopy(tmp, ri, 32); FuncF(ri, subkey + (i * 48)); XOR(ri, li, 32); MemCopy(li, tmp, 32); } } else { for (int i = 15; i >= 0; i--) { MemCopy(tmp, li, 32); FuncF(li, subkey + (i * 48)); XOR(li, ri, 32); MemCopy(ri, tmp, 32); } } Transform(m, m, ipr_table, 64); BitToByte(lp_out, m, 64); } /// <summary> /// set subkey /// </summary> /// <param name="key"></param> /// <param name="subkey_out"></param> static unsafe void DesSetKey(string key, byte* subkey_out) { if (string.IsNullOrEmpty(key)) key = KEY_DEFAULT; var des_key = stackalloc byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 }; for (int ii = 0; ii < key.Length; ii++) { des_key[ii % 8] = (byte)((des_key[ii % 8] + key[ii]) % 256); } var k = stackalloc byte[64]; var kl = k + 0; var kr = k + 28; ByteToBit(k, des_key, 64); Transform(k, k, pc1_table, 56); for (int i = 0; i < 16; i++) { Rotatel(kl, 28, loop_table[i]); Rotatel(kr, 28, loop_table[i]); Transform(subkey_out + (i * 48), k, pc2_table, 48); } } static unsafe void FuncF(byte* lpin, byte* lpki) { var mr = stackalloc byte[48]; Transform(mr, lpin, e_table, 48); XOR(mr, lpki, 48); FuncS(lpin, mr); Transform(lpin, lpin, p_table, 32); } static unsafe void FuncS(byte* lp_out, byte* lp_in) { for (int i = 0, j = 0, k = 0; i < 8; i++, lp_in += 6, lp_out += 4) { j = (lp_in[0] << 1) + lp_in[5]; k = (lp_in[1] << 3) + (lp_in[2] << 2) + (lp_in[3] << 1) + lp_in[4]; //bytetobit(lp_out, &s_box[i, j, k], 4); fixed (byte* p = s_box)//s_box[8,4,16] { var pp = p + (i * 4 * 16) + (j * 16) + k; ByteToBit(lp_out, pp, 4); } } } static unsafe void Transform(byte* out_bit, byte* in_bit, byte[] table, int len) { var tmp = stackalloc byte[256]; for (var i = 0; i < len; i++) { tmp[i] = in_bit[table “” not found /]<br> - 1]; } MemCopy(out_bit, tmp, len); } unsafe static void Rotatel(byte* lpin, int len, int loop) { var tmp = stackalloc byte[256]; MemCopy(tmp, lpin, loop); MemCopy(lpin, lpin + loop, len - loop); MemCopy(lpin + len - loop, tmp, loop); } #region <helper function> /// <summary> /// convert bytes to bits /// </summary> /// <param name="bit_out"></param> /// <param name="byt_in"></param> /// <param name="bits">The length of the output (bit length)</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] unsafe static void ByteToBit(byte* bit_out, byte* byt_in, int bits) { for (int i = 0; i < bits; i++) { bit_out[i] = (byte)((byt_in[i / 8] >> (i % 8)) & 0x01); } } /// <summary> /// convert bits to bytes /// </summary> /// <param name="lp_out"></param> /// <param name="lp_in"></param> /// <param name="bits">bit length</param> unsafe static void BitToByte(byte* lp_out, byte* lp_in, int bits) { MemZero(lp_out, (bits + 7) / 8); for (int i = 0; i < bits; i++) { lp_out[i / 8] |= (byte)((lp_in[i] & 0x01) << (i % 8)); } } [method: MethodImpl(MethodImplOptions.AggressiveInlining)] static unsafe void XOR(byte* ina, byte* inb, int len) { for (int i = 0; i < len; i++) { ina[i] ^= (byte)(inb[i] & 0x01); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] unsafe static void MemCopy(byte* dest, byte* src, int len) { for (int i = 0; i < len; i++) dest[i] = src[i]; } /// <summary> /// fill the specified buffer with 0 /// </summary> /// <param name="buffer">buffer</param> /// <param name="len">padding length</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] unsafe static void MemZero(byte* buffer, int len) { for (var i = 0; i < len; i++) buffer[i] = 0; } #endregion #endregion #region <Constructor> /// <summary> /// An example of using the system default character set as the encoding character set /// </summary> public DES() : this(Encoding.Default) { } /// <summary> /// An instance that uses the specified character set as the codec character set /// </summary> /// <param name="encoding"></param> public DES(Encoding encoding) { _encoding = encoding; } #endregion #region <public method or property> /// <summary> /// encryption /// </summary> /// <param name="text">original text to be encrypted</param> /// <param name="key">key</param> /// <returns>DES encrypted text</returns> public unsafe string Encrypt(string text, string key = "") { if (string.IsNullOrEmpty(text)) return text; var str_in = stackalloc byte[8]; var str_out = stackalloc byte[8]; var subkey = stackalloc byte[16 * 48]; //subkey DesSetKey(key, subkey); var byt_text = _encoding.GetBytes(text); int text_len = byt_text.Length; var byt_result = new byte[(text_len + 7) / 8 * 16]; int count = (text_len + 7) / 8; for (int kk = 0; kk < count; kk++) { for (int ii = 0; ii < 8; ii++) { if (kk * 8 + ii < text_len) str_in[ii] = byt_text[kk * 8 + ii]; else str_in[ii] = 0; } DesRun(str_out, str_in, DES_TYPE.ENCRYPT, subkey); for (int ii = 0; ii < 8; ii++) { var value = str_out[ii]; byt_result[kk * 16 + 2 * ii] = (byte)(value / 16 < 10 ? value / 16 + '0' : value / 16 - 10 + 'A'); byt_result[kk * 16 + 2 * ii + 1] = (byte)(value % 16 < 10 ? value % 16 + '0' : value % 16 - 10 + 'A'); } } return Encoding.ASCII.GetString(byt_result); } /// <summary> /// decrypt /// </summary> /// <param name="des">DES encrypted text</param> /// <param name="key">key</param> /// <returns>Decrypted original text</returns> public unsafe string Decrypt(string des, string key = "") { if (string.IsNullOrEmpty(des)) return des; var byt_text = Encoding.ASCII.GetBytes(des); //Convert the hexadecimal text string to normal characters. int text_len = byt_text.Length; var text_str = new byte[text_len / 2]; if (text_len % 16 != 0) return ""; //The length of the DES encrypted string must be a multiple of 16 for (int ii = 0; ii < text_len; ii += 2) { var ch1 = byt_text[ii]; var ch2 = byt_text[ii + 1]; if (!(ch1 >= '0' && ch1 <= '9' || ch1 >= 'A' && ch1 <= 'F')) return ""; if (!(ch2 >= '0' && ch2 <= '9' || ch2 >= 'A' && ch2 <= 'F')) return ""; var k1 = ch1 <= '9' ? ch1 - '0' : ch1 - 'A' + 10; var k2 = ch2 <= '9' ? ch2 - '0' : ch2 - 'A' + 10; var kk = (byte)(k1 * 16 + k2); text_str[ii / 2] = kk; } var str_in = stackalloc byte[8]; var str_out = stackalloc byte[8]; var subkey = stackalloc byte[16 * 48]; DesSetKey(key, subkey); text_len = text_str.Length; var byt_result = new byte[text_len]; int len = 0; for (int kk = 0; kk < text_len / 8; kk++) { for (int ii = 0; ii < 8; ii++) { if (kk * 8 + ii < text_len) str_in[ii] = text_str[kk * 8 + ii]; else str_in[ii] = 0; } DesRun(str_out, str_in, DES_TYPE.DECRYPT, subkey); for (int ii = 0; ii < 8; ii++) { byt_result[kk * 8 + ii] = str_out[ii]; if (str_out[ii] != 0) len = kk * 8 + ii + 1; } } return _encoding.GetString(byt_result, 0, len); } /// <summary> /// The character set used by the current instance during encoding and decoding /// </summary> public Encoding Encoding { get { return _encoding; } } #endregion } }
C# implements DES encryption
![C# implements DES encryption algorithm 4 C# implements DES encryption](https://znlive.com/wp-content/uploads/2022/07/C-implements-DES-encryption-1024x509.png)
This post was originally published on my Chinese blog site, you can find it here. C# implements DES encryption algorithm.