Cryptage par des

Contenu du snippet

Ce programme a été créé dans le but de faire des tests de cryptage par DES.....
La classe est riche en méthodes mais aussi en théorie ...

Source / Exemple :


import java.math.*;
import java.util.*;
import java.lang.*;

/**
 *

  • @author scupper
  • @since Fri Feb 25 At 3:58
*
  • /
public class DESEncrypting { private int radix = 0; private static final int[][] 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}}; private static final int[][] 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 }}; private static final int[][] S3 = {{10,0 ,9 ,14,6 ,13,15,5 ,1 ,13,12,7 ,11,4 ,2 ,8 }, {13,7 ,0 ,9 ,3 ,4 ,6 ,10,2 ,8 ,5 ,14,2 ,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}}; private static final int[][] S4 = {{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 }}; private static final int[][] S5 = {{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 }}; private static final int[][] S6 = {{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 }}; private static final int[][] S7 = {{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 }}; private static final int[][] S8 = {{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 }}; private static Vector SBOX = new Vector(); private final int[][] E = {{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 }}; private final int[][] P = {{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}}; public static void setSBOX(){ SBOX.add(S1); SBOX.add(S2); SBOX.add(S3); SBOX.add(S4); SBOX.add(S5); SBOX.add(S6); SBOX.add(S7); SBOX.add(S8); } public void setRadix(int radix){ this.radix = radix; } public long max(long a , long b){ return (a>b)?a:b; } public long min(long a , long b){ return (a>b)?b:a; } public int max(int a , int b){ return (a>b)?a:b; } public int min(int a , int b){ return (a>b)?b:a; } public Vector setRadix(Vector V,int radix){ Vector VV = new Vector(); int diff; if((diff =this.radix-V.size())>0){ for(int i=0;i<diff;i++){ VV.add(0); } for(int i=diff;i<this.radix;i++){ VV.add(V.get(i-diff)); } }else{ VV = V; } return VV; } public Vector longToBinaire(long n){ Vector v = new Vector(); Vector V = new Vector(); Vector VV = new Vector(); int iteration=0; int diff; //Division euclidienne dans la base 2 et insertion dans un vecteur while(n>0){ v.add(iteration, n%2); n/=2; iteration++; } //on inverse l'ordre des éléments du vecteur précédents pour avoir n en base 2 for(int i=0;i<v.size();i++){ V.add(v.get(v.size()-i-1)); } /**
  • Début du formatage en N bits qui est Définis par N = radix
  • /
if((diff =this.radix-V.size())>0){ for(int i=0;i<diff;i++){ VV.add(0); } for(int i=diff;i<this.radix;i++){ VV.add(V.get(i-diff)); } }else{ VV = V; } /**
  • Fin du formatage
  • /
return VV; } public Vector intToBinaire(int n){ Vector v = new Vector(); Vector V = new Vector(); Vector VV = new Vector(); int iteration=0; int diff; //Division euclidienne dans la base 2 et insertion dans un vecteur while(n>0){ v.add(iteration, n%2); n/=2; iteration++; } //on inverse l'ordre des éléments du vecteur précédents pour avoir n en base 2 for(int i=0;i<v.size();i++){ V.add(v.get(v.size()-i-1)); } /**
  • Début du formatage en N bits qui est Définis par N = radix
  • /
if((diff =this.radix-V.size())>0){ for(int i=0;i<diff;i++){ VV.add(0); } for(int i=diff;i<this.radix;i++){ VV.add(V.get(i-diff)); } }else{ VV = V; } /**
  • Fin du formatage
  • /
return VV; } public Vector sommeBinaire(Vector v,Vector w){ Vector x = new Vector(); int radix = max(v.size(),w.size()); setRadix(v,radix); setRadix(w,radix); for(int i=0;i<radix;i++){ if(v.get(i)!=w.get(i))x.add(1); else x.add(0); } return x; } public static long binaireToDecimal(Vector v){ long dec = 0,i=v.size(); for(int j=0;j<v.size();j++){ dec+=(long)(Integer.parseInt(v.elementAt(j).toString())*Math.pow(2,i-j-1)); } return dec; } public static int binaireToInt(Vector v){ int dec = 0,i=v.size(); for(int j=0;j<v.size();j++){ dec+=(int)(Integer.parseInt(v.elementAt(j).toString())*Math.pow(2,i-j-1)); } return dec; } public Vector S_Box(Vector v){ Vector x = new Vector(); Vector temp = new Vector(); int row ,column; int j=0 ; if(v.size()==6){ for(int i = 0;i<6;i=i+5){ temp.add(j, v.get(i)); j++; } row = binaireToInt(temp); temp.clear(); temp.trimToSize(); // System.out.println("Row = "+row); j=0; for(int i = 1;i<5;i++){ temp.add(j, v.get(i)); j++; } column = binaireToInt(temp); temp.clear(); temp.trimToSize(); // System.out.println("Column = "+column); x = intToBinaire(S1[row][column]); } return x; } public Vector S_Box(Vector v,int[][] S){ Vector x = new Vector(); Vector temp = new Vector(); int row ,column; int j=0 ; if(v.size()==6){ for(int i = 0;i<6;i=i+5){ temp.add(j, v.get(i)); j++; } row = binaireToInt(temp); temp.clear(); temp.trimToSize(); // System.out.println("Row = "+row); j=0; for(int i = 1;i<5;i++){ temp.add(j, v.get(i)); j++; } column = binaireToInt(temp); temp.clear(); temp.trimToSize(); // System.out.println("Column = "+column); x = intToBinaire(S[row][column]); } return x; } public Vector expansion3248(Vector v){ Vector x = new Vector(); int row , column , pos; if(v.size()==32){ for(int i=0;i<48;i++){ row = i/6; column = i%6; pos = E[row][column]-1; x.add(i,v.get(pos)); } } return x; } public Vector permutation(Vector v){ Vector x = new Vector(); int row , column , pos; if(v.size()==32){ for(int i=0;i<32;i++){ row = i/4; column = i%4; pos = P[row][column]-1; x.add(i,v.get(pos)); } } return x; } public Vector[] divideVectorTo8Vectors(Vector v){ Vector[] vSet = new Vector[8]; int ind; for(ind =0;ind<8;ind++){ vSet[ind] = new Vector(); for(int i=ind*(v.size()/8);i<ind*(v.size()/8)+(v.size()/8);i++){ vSet[ind].add(v.elementAt(i)); } } return vSet; } public Vector undivideVectorSet(Vector[] vSet){ Vector v = new Vector(); for(int i=0;i<vSet.length;i++){ for(int j =0 ; j<vSet[i].size();j++){ v.add(vSet[i].elementAt(j)); } } return v; } public static void main(String[] args){ DESEncrypting obj = new DESEncrypting(); setSBOX(); Vector v ; Vector w ; long dec; int[] xx = {1,1,1,0, 1,1,1,1, 0,1,0,0, 1,0,1,0, 0,1,1,0, 0,1,0,1, 0,1,0,0, 0,1,0,0}; int[] yy = {0,1,1,1, 1,0,0,1, 1,0,1,0, 1,1,1,0, 1,1,0,1, 1,0,0,1, 1,1,0,1, 1,0,1,1, 1,1,0,0, 1,0,0,1, 1,1,1,0, 0,1,0,1}; Vector XX = new Vector(); for(int i = 0;i<xx.length;i++){ XX.add(xx[i]); } Vector YY = new Vector(); for(int i = 0;i<yy.length;i++){ YY.add(yy[i]); } // System.out.println(obj.expansion3248(XX).size()); Vector E_XX = new Vector(); Vector Addition = new Vector(); E_XX = obj.expansion3248(XX); for(int i =0; i<48;i++){ System.out.print(E_XX.get(i)); } System.out.println(); System.out.println(); for(int i =0; i<48;i++){ System.out.print(YY.get(i)); } System.out.println(); System.out.println(); Addition = obj.sommeBinaire(E_XX,YY); for(int i =0; i<48;i++){ System.out.print(Addition.get(i)); } System.out.println(); System.out.println(); Vector[] Devidend = new Vector[8]; Devidend = obj.divideVectorTo8Vectors(Addition); for(int i = 0;i<8;i++){ System.out.print(i+" : "); for(int j=0;j<Devidend[i].size();j++){ System.out.print(Devidend[i].get(j)); } System.out.println(); obj.setRadix(4); System.out.println(obj.S_Box(Devidend[i], (int[][]) SBOX.elementAt(i))); } Vector P_C = new Vector(); Vector[] vSet = new Vector[8]; for(int i = 0;i<8;i++){ vSet[i] = new Vector(); vSet[i] = obj.S_Box(Devidend[i], (int[][]) SBOX.elementAt(i)); } P_C = obj.permutation(obj.undivideVectorSet(vSet)); for(int i = 0;i<P_C.size();i++){ System.out.print(P_C.get(i)); } } }

Conclusion :


Comme résultat on aurait :

run:
011101011110101001010100001100001010101000001001

011110011010111011011001110110111100100111100101

000011000100010010001101111010110110001111101100

0 : 000011
[1, 1, 1, 1]
1 : 000100
[1, 0, 0, 0]
2 : 010010
[1, 1, 0, 1]
3 : 001101
[1, 0, 0, 0]
4 : 111010
[0, 0, 1, 1]
5 : 110110
[0, 1, 1, 0]
6 : 001111
[1, 1, 1, 0]
7 : 101100
[1, 1, 0, 1]
00101100101110011000111111101011BUILD SUCCESSFUL (total time: 0 seconds)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.