Алгоритм шифрования des java

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-битная последовательность зашифрованного текста. Обзор теории всегда скучен, и его нелегко описать. Просто посмотрите на картинку выше, и на следующем рисунке показан принцип алгоритма:

Читайте также:  Execute python script in python command line

Принцип анализа

Алгоритм 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 = , < 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 завершена.

Читайте также:  Java mysql error communications link failure
Операции шифрования и дешифрования
 // Первоначальная замена 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) 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

Splunk tutorial

SPSS tutorial

Swagger tutorial

T-SQL tutorial

Tumblr tutorial

React tutorial

Regex tutorial

Reinforcement learning tutorial

R Programming tutorial

RxJS tutorial

React Native tutorial

Python Design Patterns

Python Pillow tutorial

Python Turtle tutorial

Keras tutorial

Preparation

Aptitude

Logical Reasoning

Verbal Ability

Company Interview Questions

Artificial Intelligence

AWS Tutorial

Selenium tutorial

Cloud Computing

Hadoop tutorial

ReactJS Tutorial

Data Science Tutorial

Angular 7 Tutorial

Blockchain Tutorial

Git Tutorial

Machine Learning Tutorial

DevOps Tutorial

B.Tech / MCA

DBMS tutorial

Data Structures tutorial

DAA tutorial

Operating System

Computer Network tutorial

Compiler Design tutorial

Computer Organization and Architecture

Discrete Mathematics Tutorial

Ethical Hacking

Computer Graphics Tutorial

Software Engineering

html tutorial

Cyber Security tutorial

Automata Tutorial

C Language tutorial

C++ tutorial

Java tutorial

.Net Framework tutorial

Python tutorial

List of Programs

Control Systems tutorial

Data Mining Tutorial

Data Warehouse Tutorial

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 RSS Feed Subscribe to Get Email Alerts Facebook Page Twitter Page YouTube Blog Page

Источник

Оцените статью