DES Implementation In Java with ECB | CBC | OFB | CFB Modes Of Operation
Output
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESkeygen
Key generated and saved in DESkey.txt
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESencrypt
Usage: java
:= (ECB|CBC|OFB|CFB)
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESencrypt ecb
Encryption done! Please check DESciphertext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESdecrypt ecb
Decryption done! Please check DESplaintext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESencrypt cbc
Encryption done! Please check DESciphertext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESdecrypt cbc
Decryption done! Please check DESplaintext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESencrypt ofb
Encryption done! Please check DESciphertext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESdecrypt ofb
Decryption done! Please check DESplaintext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESencrypt cfb
Encryption done! Please check DESciphertext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESdecrypt cfb
Decryption done! Please check DESplaintext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$ java DESdecrypt cfb
Decryption done! Please check DESplaintext.txt for output!
dhanoopbhaskar@dhanoop-laptop:~/workspace$
About Input/Output Files
DESkeygen.java — (output) DESkey.txt
DESencrypt.java — (input) DESkey.txt & DESplaintext.txt (output) DESciphertext.txt
DESdecrypt.java — (input) DESkey.txt & DESciphertext.txt (output) DESplaintext.txt
Русские Блоги
В предыдущей статье был представлен принцип и Java-реализация пароля Фейстеля. В этой статье будут представлены принцип и Java-реализация алгоритма DES. Для Java-реализации здесь приведен только один код (есть и другие способы достижения, в основном, чтобы иметь дело с Способ двоичных разрядов другой).
Обзор
DES — это алгоритм блочного шифрования, который шифрует данные 64-битными блоками. В то же время DES также является симметричным алгоритмом: тот же алгоритм используется для шифрования и дешифрования. DES — это 16-ступенчатый алгоритм блочного шифрования «замена-замена». В качестве входных данных алгоритма шифрования используется 64-битная блочная последовательность открытого текста. После 16 раундов шифрования получается 64-битная последовательность зашифрованного текста. Обзор теории всегда скучен, и его нелегко описать. Просто посмотрите на картинку выше, и на следующем рисунке показан принцип алгоритма:
Принцип анализа
Алгоритм DES в основном разделен на три части: операции шифрования и дешифрования, обработка функции f и генерация ключа колеса, которые кратко представлены справа налево.
Генерация колесных ключей
//PC-1 private int[] PC1=; //PC-2 private int[] PC2=; //Schedule of Left Shifts private int[] LFT=; Скопировать код
16 подключей генерируются в основном с использованием таблицы номеров в таблице данных 1. Сначала 64-битный исходный ключ сжимается с помощью PC1 для замены 56-битного ключа, а затем он делится на два, здесь обозначенных как C0 и D0. Здесь 28-битное C0 и 28-битное D0 сдвигаются влево согласно значению соответствующей позиции в массиве LET, чтобы получить C1 и D1. Это объединяет C1 и D1 для выполнения сжатия и замены согласно PC2 для получения 48-битного подключа, и обратите внимание, что C1 и D1 используются в качестве входных данных для следующего раунда для генерации следующего подключа.
Действие функции f
// Расширение E private int[] E=; // P замена private int[] P=; private static final int [] [] [] S_Box =/ S-Box / S_Box[1] < 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 >>, < // S_Box[2] < 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 >>, < // S_Box[3] < 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 >>, < // S_Box[4] < 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 >>, < // S_Box[5] < 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 >>, < // S_Box[6] < 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 >>, < // S_Box[7] < 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 >>, < // S_Box[8] < 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 >> >; Скопировать код
Из схематической диаграммы видно, что входом функции f является правая половина группы открытого текста, обозначенной как R, а подключ — как K. 32-битный R должен сначала использовать E в таблице данных 2, чтобы выполнить преобразование расширения E-box для получения 48-битных данных, которые здесь помечены как RE. Затем RE и K подвергаются операции XOR и результат XOR заменяется на S_BOX в таблице данных 2, а результат 48-битной операции записывается как RS. Затем RS использует P в таблице данных 2, чтобы заменить поле P, чтобы получить 32-битный окончательный результат, который помечен как RF. На этом задача вычисления функции f завершена.
Операции шифрования и дешифрования
// Первоначальная замена private int[] IP=; // Обратная начальная замена private int[] IP_1=; Скопировать код
Об IP и IP -1 Я не буду говорить об операции перестановки, мне просто нужно поговорить о процессе шифрования одного раунда. В первом раунде 64-битный открытый текст делится на L0 и R0, а операция шифрования выглядит следующим образом:
L1=R0
R1=L0⊕f(R0,K0)
Затем следуйте этой формуле, чтобы выполнить 16 циклов вычислений.
Код
package com.general.encryanddecode; import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; import java.util.Arrays; /** * @author generalandroid * * Реализовать алгоритм шифрования DES, основанный на принципе алгоритма DES, в основном для более глубокого понимания алгоритма DES. * **/ public class CustomDES < // Первоначальная замена private int[] IP=; // Обратная начальная замена private int[] IP_1=; // Руки отключены, данные массива записаны не все // Расширение E private int[] E=; // P замена private int[] P=; private static final int[][][] S_Box = < < < 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 >>, < < 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 >>, < < 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 >>, < < 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 >>, < < 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 >>, < < 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 >>, < < 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 >>, < < 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 >> >; //PC-1 private int[] PC1=; //PC-2 private int[] PC2=; //Schedule of Left Shifts private int[] LFT=; / ** Раунды шифрования ** / private static final int LOOP_NUM=16; private String [] keys=new String[LOOP_NUM]; private String [] pContent; private String [] cContent; private int origin_length; / ** 16 подключей ** / private int[][] sub_key=new int[16][48]; private String content; private int p_origin_length; public CustomDES(String key,String content) < this.content=content; p_origin_length=content.getBytes().length; generateKeys(key); >public static void main(String[] args)< String origin="Android General-> GeneralAndroid-> Основной адрес блога: https://blog.csdn.net/android_jiangjun"; System.out.println("Оригинал: \ n"+origin); CustomDES customDES=new CustomDES(«Криптографическая колонка»,origin); byte[] c=customDES.deal(origin.getBytes(),1); System.out.println(«Шифрованный текст: \ n»+new String(c)); byte[]p=customDES.deal(c,0); byte[] p_d=new byte[origin.getBytes().length]; System.arraycopy(p,0,p_d,0,origin.getBytes().length); System.out.println("Открытый текст: \ n"+new String(p)); > / *** Результаты выполнения кода: * Оригинал: Общие Android-> GeneralAndroid-> Адрес основного блога: https://blog.csdn.net/android_jiangjun Шифрованный текст: ��Lm����=��� 4�zf4�����zj���>���~Dͪn�B��t���Du��U*e�VxC�̃Ynh\@NH ˙P�Ka�1y~4 Простой текст: Общие Android-> GeneralAndroid-> Адрес основного блога: https://blog.csdn.net/android_jiangjun * * **/ / **** Сплит группа **** / public byte[] deal(byte[] p ,int flag)< origin_length=p.length; int g_num; int r_num; g_num=origin_length/8; r_num = 8- (origin_length-g_num * 8); // 8 не заполняем byte[] p_padding; / **** Заливка ******** / if (r_num<8)< p_padding=new byte[origin_length+r_num]; System.arraycopy(p,0,p_padding,0,origin_length); for(int i=0;i >else < p_padding=p; >g_num=p_padding.length/8; byte[] f_p=new byte[8]; byte[] result_data=new byte[p_padding.length]; for(int i=0;i if (flag == 0)/ расшифровка byte[] p_result_data=new byte[p_origin_length]; System.arraycopy(result_data,0,p_result_data,0,p_origin_length); return p_result_data; > return result_data; > / ** Шифрование ** / public byte[] descryUnit(byte[] p,int k[][],int flag)< int[] p_bit=new int[64]; StringBuilder stringBuilder=new StringBuilder(); for(int i=0;i<8;i++)< String p_b=Integer.toBinaryString(p[i]&0xff); while (p_b.length()%8!=0)< p_b="0"+p_b; > stringBuilder.append(p_b); > String p_str=stringBuilder.toString(); for(int i=0;i<64;i++)< int p_t=Integer.valueOf(p_str.charAt(i)); if(p_t==48)< p_t=0; >else if(p_t==49)< p_t=1; >else< System.out.println("To bit error!"); > p_bit[i]=p_t; > / *** Замена IP *** / int [] p_IP=new int[64]; for (int i=0;i <64;i++)< p_IP[i]=p_bit[IP[i]-1]; >if (flag == 1)/ шифрование for (int i = 0; i < 16; i++) < L(p_IP, i, flag, k[i]); >> else if (flag == 0)/ расшифровать for (int i = 15; i > -1; i--) < L(p_IP, i, flag, k[i]); >> int[] c=new int[64]; for(int i=0;i byte[] c_byte=new byte[8]; for(int i=0;i <8;i++)< c_byte[i]=(byte) ((c[8*i]<<7)+(c[8*i+1]<<6)+(c[8*i+2]<<5)+(c[8*i+3]<<4)+(c[8*i+4]<<3)+(c[8*i+5]<<2)+(c[8*i+6]<<1)+(c[8*i+7])); >return c_byte; > public void L(int[] M, int times, int flag, int[] keyarray)< int[] L0=new int[32]; int[] R0=new int[32]; int[] L1=new int[32]; int[] R1=new int[32]; int[] f=new int[32]; System.arraycopy(M,0,L0,0,32); System.arraycopy(M,32,R0,0,32); L1=R0; f=fFuction(R0,keyarray); for(int j=0;j<32;j++)< R1[j]=L0[j]^f[j]; if (((flag == 0) && (times == 0)) || ((flag == 1) && (times == 15))) < M[j] = R1[j]; M[j + 32] = L1[j]; >else < M[j] = L1[j]; M[j + 32] = R1[j]; >> > public int[] fFuction(int [] r_content,int [] key)< int[] result=new int[32]; int[] e_k=new int[48]; for(int i=0;i / ******** Замена блока S: изменить с 48 бит на 32 бит, теперь разделить e_k, а затем заменить ********* / int[][] s=new int[8][6]; int[]s_after=new int[32]; for(int i=0;i<8;i++)< System.arraycopy(e_k,i*6,s[i],0,6); int r = (s [i] [0] << 1) + s [i] [5]; // абсцисса int c = (s [i] [1] << 3) + (s [i] [2] << 2) + (s [i] [3] << 1) + s [i] [4]; // ось Y String str=Integer.toBinaryString(S_Box[i][r][c]); while (str.length()<4)< str="0"+str; > for(int j=0;j<4;j++)< int p=Integer.valueOf(str.charAt(j)); if(p==48)< p=0; >else if(p==49)< p=1; >else< System.out.println("To bit error!"); > s_after[4*i+j]=p; > > / ****** Сменный конец S-бокса ******* / / **** Поле P вместо **** / for(int i=0;i return result; > / ** Создать подключ ** / public void generateKeys(String key)< while (key.length() <8)< key=key+key; >key=key.substring(0,8); byte[] keys=key.getBytes(); int[] k_bit=new int[64]; // занимаем место значение for(int i=0;i<8;i++)< String k_str=Integer.toBinaryString(keys[i]&0xff); if(k_str.length()<8)< for(int t=0;t<8-k_str.length();t++)< k_str="0"+k_str; > > for(int j=0;j<8;j++)< int p=Integer.valueOf(k_str.charAt(j)); if(p==48)< p=0; >else if(p==49)< p=1; >else< System.out.println("To bit error!"); > k_bit[i*8+j]=p; > > // k_bit - это начальный 64-битный длинный ключ, следующим шагом будет его замена / *********** Сжатие ПК-1 **************** / int [] k_new_bit=new int[56]; for(int i=0;i /**************************/ int[] c0=new int[28]; int[] d0=new int[28]; System.arraycopy(k_new_bit,0,c0,0,28); System.arraycopy(k_new_bit,28,d0,0,28); for(int i=0;i<16;i++)< int[] c1=new int[28]; int[] d1=new int[28]; if(LFT[i]==1)< System.arraycopy(c0,1,c1,0,27); c1[27]=c0[0]; System.arraycopy(d0,1,d1,0,27); d1[27]=d0[0]; >else if(LFT[i]==2)< System.arraycopy(c0,2,c1,0,26); c1[26]=c0[0]; c1 [27] = c0 [1]; // Здесь написано как c1 до травмы руки System.arraycopy(d0,2,d1,0,26); d1[26]=d0[0]; d1[27]=d0[1]; >else< System.out.println("LFT Error!"); > int[] tmp=new int[56]; System.arraycopy(c1,0,tmp,0,28); System.arraycopy(d1,0,tmp,28,28); for (int j = 0; j c0=c1; d0=d1; > > > Скопировать код
подводить итоги
Если вы хотите понять принцип работы алгоритма DES, вы можете понять его без статьи. Сначала вам нужно найти книгу, чтобы прочитать введение в DES, затем понять каждый шаг, а затем написать код для реализации простого алгоритма DES. Укажите источник последней перепечатки:Принцип алгоритма DES и реализация на Java Если вам интересна эта статья, вы можете следить за моей колонкой криптографии:Криптография, Вы можете увидеть мое обновление ранее.
Алгоритм шифрования des java
Learn Latest Tutorials
Preparation
Trending Technologies
B.Tech / MCA
Javatpoint Services
JavaTpoint offers too many high quality services. Mail us on h[email protected], to get more information about given services.
- Website Designing
- Website Development
- Java Development
- PHP Development
- WordPress
- Graphic Designing
- Logo
- Digital Marketing
- On Page and Off Page SEO
- PPC
- Content Development
- Corporate Training
- Classroom and Online Training
- Data Entry
Training For College Campus
JavaTpoint offers college campus training on Core Java, Advance Java, .Net, Android, Hadoop, PHP, Web Technology and Python. Please mail your requirement at [email protected].
Duration: 1 week to 2 week
Like/Subscribe us for latest updates or newsletter