· 5 years ago · Feb 28, 2020, 04:54 AM
1
2import javax.crypto.Cipher;
3import javax.crypto.SecretKey;
4import javax.crypto.SecretKeyFactory;
5import javax.crypto.spec.IvParameterSpec;
6import javax.crypto.spec.PBEKeySpec;
7import javax.crypto.spec.SecretKeySpec;
8import java.lang.reflect.Array;
9import java.nio.charset.StandardCharsets;
10import java.security.SecureRandom;
11import java.security.spec.KeySpec;
12import java.util.*;
13import java.util.concurrent.*;
14
15
16public class tryKeysSequential_Omp {
17 static int keylsbs=0, maxcounter;
18 private static final int[] mask = new int[]
19 {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80};
20
21 public static String encrypt(String strToEncrypt, byte[] secret)
22 {
23 try
24 {
25 SecretKeySpec sskey= new SecretKeySpec(secret, "AES");
26
27 Cipher c = Cipher.getInstance("AES");
28
29 c.init(Cipher.ENCRYPT_MODE, sskey);
30
31 byte[] encrypted = c.doFinal(strToEncrypt.getBytes());
32// System.out.println("encrypted string: " + encrypted.toString());
33 return Base64.getEncoder().encodeToString(encrypted);
34 }
35 catch (Exception e)
36 {
37 System.out.println("Error while encrypting: " + e.toString());
38 }
39 return null;
40 }
41
42 public static byte modifyBit(byte n, int p, int b) {
43 int mask = 1 << p;
44 return (byte) ((n & ~mask) | ((b << p) & mask));
45 }
46 public static int checkbit(byte valByte, int pos) {
47 int num =(int)Math.pow(2, pos);
48 if ((valByte & num) == num ) {
49 return 1;
50 }
51 else
52 return 0;
53 }
54
55 public static void main(String args[]) {
56
57
58// System.out.println(args[0]);
59 Scanner in = new Scanner(System.in);
60 System.out.println("Enter Plaintext: ");
61 String originalString = in.nextLine();
62 // String originalString = "test Sequential";
63 System.out.println("Enter Number of bits: ");
64 int numOfBytes = in.nextInt();
65 // int numOfBytes = 8;
66
67
68 byte[] keyArray = SecureRandom.getSeed(32);
69 System.out.println("Original :"+keyArray[30]+" "+keyArray[31]);
70
71// String secretKey = new String(keyArray, StandardCharsets.UTF_8);
72
73
74 String encryptedString = encrypt(originalString, keyArray);
75 System.out.println("Cipher text with original Key: " + encryptedString);
76 for(int i=0;i<(numOfBytes/8);i++){
77 keylsbs |= ((keyArray[31-i] & 0xFF)<< 8*(i+1));
78 }
79 // System.out.println(String.format("BEre key array zero: %7s", Integer.toBinaryString(keyArray[31] & 0xFF)).replace(' ', '0'));
80 for(int i=(32-(numOfBytes/8));i<32;i++){
81 Array.setByte(keyArray, i, (byte) 0);
82 }
83
84 if(numOfBytes%8!=0){
85 byte temp=(byte) 255;
86 keyArray[31-(numOfBytes/8)] &= (byte)(temp << (numOfBytes%8));
87 }
88 // System.out.println(String.format("After key array zero %7s", Integer.toBinaryString(keyArray[31] & 0xFF)).replace(' ', '0'));
89 // keyArray[31-(numOfBytes/8)] &= mask[numOfBytes%8];
90// System.out.println(keyArray[31]);
91// String s3 = String.format("%8s", Integer.toBinaryString(keyArray[31] & 0xFF)).replace(' ', '0');
92// System.out.println(s3);
93
94 byte[] trialkey = new byte[32];
95 System.arraycopy(keyArray,0,trialkey,0,32);
96
97
98 long start = System.currentTimeMillis();
99
100 maxcounter = (1 <<numOfBytes)-1;
101 int dummy =0;
102 // omp parallel for
103 for(int counter = 0; counter <= maxcounter && dummy==0; ++counter) {
104
105
106 int lsbs = counter;
107 // System.out.println("lsbs:" +lsbs);
108 int indx =0;
109 for(indx=0;indx<numOfBytes/8;indx++){
110
111 trialkey[31-indx] = (byte) (lsbs >>> indx*8);
112 }
113 if (numOfBytes%8!=0) {
114
115 int number = numOfBytes%8;
116 //System.out.println(String.format("%8s", Integer.toBinaryString(trialkey[indx] & 0xFF)).replace(' ', '0'));
117 // System.out.println("Before " + trialkey[31]);
118 //System.out.println(String.format("%8s", Integer.toBinaryString((lsbs >>> indx*8) & 0xFF)).replace(' ', '0'));
119 for (int i=0;i<number;i++) {
120 trialkey[31-indx] = modifyBit(trialkey[31-indx],i,checkbit((byte) (lsbs >>> indx*8),i));
121 //System.out.println(checkbit(org,i));
122 }
123 // System.out.println("after " + trialkey[31]);
124 //System.out.println(String.format("%8s", Integer.toBinaryString(trialkey[indx] & 0xFF)).replace(' ', '0'));
125 }
126
127 String dynamicdecryptedString = encrypt(originalString, trialkey);
128 System.out.println("Running:"+trialkey[30]+" "+trialkey[31]);
129
130
131 try {
132 if (encryptedString.compareTo(dynamicdecryptedString)==0) {
133
134 System.out.println("Matching Trial key : "+dynamicdecryptedString);
135 System.out.println("Time required -> "+(System.currentTimeMillis() - start)+" ms");
136 //dummy =1;
137 }
138 }
139 catch (NullPointerException e){
140
141 }
142
143 }
144
145
146 }
147
148}