package thesis; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.FileReader; import java.math.BigInteger; import java.util.Random; import javax.imageio.ImageIO; import java.io.IOException; import java.util.Date; import java.io.File; import java.util.ArrayList; public class Thesis { public static Random r = new Random(); public static String Random_key = ""; public static String AMBIG_BIT =""; public static String DNA_Image = ""; public static int Image_length = 0; public static int DNASegment =r.nextInt(5 + 0) + 0; public static int WhenStart =r.nextInt(30000 + 0) + 0; public static int [] Archies =new int[900000]; public static int PaddingSize = 0; ////////////////// ///////////////// // Convert Image to binary String public static void Binary_Image( String Image)throws Exception{ // 2 second String Binary_Image = ""; BufferedImage bImage = ImageIO.read(new File(Image)); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(bImage, "jpg", bos ); byte [] byte_Image = bos.toByteArray(); for (int i =0; i< byte_Image.length; i++){ Binary_Image += String.format("%8s", Integer.toBinaryString(byte_Image[i] & 0xFF)).replace(' ', '0'); } // System.out.println("The binary image is: "+Binary_Image); // System.out.println("The binary image is: "+Binary_Image.length()); Feistel_Network (Binary_Image ); // decoder_binary_Image (Binary_Image); } //Split String Image to blocks private static ArrayList splitStringBySize(String str, int size) { ArrayList split = new ArrayList<>(); for (int i = 0; i <= str.length() / size; i++) { split.add(str.substring(i * size, Math.min((i + 1) * size, str.length()))); } return split; } //Encryption process public static void Feistel_Network (String Binary_Image )throws Exception{ String Righttext ="" , Lefttext="" ; String AnewRight = ""; StringBuffer AnewLeft=new StringBuffer(); String After_Encrypt = ""; //for add padding in the last block for(int j =0 ; Binary_Image.length() % 64 !=0 ; j++ ){ Binary_Image+="0"; PaddingSize += 1; } System.out.println("before Feistel_Network process : "+ Binary_Image); ArrayList split=splitStringBySize(Binary_Image, 64); // System.out.println(split.size()); for(int i=0;i< Binary_Image.length()/64;i++){ Lefttext= split.get(i).substring(0,32); Righttext= split.get(i).substring(32,64); AnewLeft.delete(0, Binary_Image.length()/64); for(int j=0;j<32;j++){ // AND function between key and RightText if ((Righttext.charAt(j) & Random_key.charAt(j)) == '1') AnewRight += "1"; else AnewRight += "0"; // XOR the output of previus step with LeftText AnewLeft.append(AnewRight.charAt(j)^Lefttext.charAt(j)); } After_Encrypt += Righttext + AnewLeft ; } // System.out.println(PaddingSize); System.out.println("binary Image : "+ After_Encrypt); DNA_Image= Convert_Binary_To_DNA_Base(After_Encrypt); Image_length = DNA_Image.length(); System.out.println("Extract Image :"+DNA_Image); DNAFile(); } // Convert binary String to DNA sequence public static String Convert_Binary_To_DNA_Base( String Binary_Data )throws Exception { String ConTo_DNA = ""; for (int i = 0 ; i <= Binary_Data.length()-1; i++){ String div_string = Binary_Data.substring(i, i+2); if(div_string.equals("00")) ConTo_DNA += "A"; if(div_string.equals("10")) ConTo_DNA += "G"; if(div_string.equals("01")) ConTo_DNA += "C"; if(div_string.equals("11")) ConTo_DNA += "T"; i++; } return ConTo_DNA; } // Read DNA file public static void DNAFile () throws IOException, Exception { // 0 second StringBuilder DNA_File = new StringBuilder(); char[] buffer = new char[10]; try (BufferedReader reader = new BufferedReader(new FileReader("C:\\base64\\AC153526.txt"))) { while (reader.read(buffer) != -1) { DNA_File.append(new String(buffer)); }} // System.out.println("The orginal DNA sequence is: "+ DNA_File.toString()); HidingProcess(DNA_File); } // Hiding process public static void HidingProcess (StringBuilder DNA_File) throws IOException, Exception { for(int i = WhenStart , j = 0; j =0; i-- ){ DNASequence.deleteCharAt(Archies[i]); } System.out.println("compare :"+DNASequence); /// // Extract Image String ExtractImage = ""; for(int i=WhenStart ,j=0; j< Image_length;i++ ,j++){ ExtractImage += DNASequence.charAt(i); i = i+DNASegment -1; } System.out.println("Extract Image :"+ExtractImage); Convert_DNA_Base_To_Binary(ExtractImage); } // Convert DNA Sequence to Binary Sequence public static void Convert_DNA_Base_To_Binary( String DNA_Image )throws Exception { String Binary_Image = new String(); for (int i = 0 ; i <= DNA_Image.length()-1; i++){ if(DNA_Image.charAt(i)==('A')) Binary_Image += "00"; if(DNA_Image.charAt(i)==('G')) Binary_Image += "10"; if(DNA_Image.charAt(i)==('C')) Binary_Image += "01"; if(DNA_Image.charAt(i)==('T') ) Binary_Image += "11"; } System.out.println("binary Image : "+ Binary_Image); Reverse_Feistel_Network ( Binary_Image ); } // Reverse feistel network process public static void Reverse_Feistel_Network (String Binary_Image )throws Exception{ String Righttext , Lefttext ; String And_Result = ""; StringBuffer AnewRight =new StringBuffer(); String AnewLeft = ""; String strNew = ""; ///////////////////////////////////// ArrayList split=splitStringBySize(Binary_Image, 64); // System.out.println(split.size()); for(int f=0;f