1. 程式人生 > 實用技巧 >Buuoj Java逆向解密

Buuoj Java逆向解密

1. 下載壓縮包,解壓得到Reverse.class,用IDEA開啟,得到以下原始碼

 1 import java.util.ArrayList;
 2 import java.util.Scanner;
 3 
 4 public class Reverse {
 5     public Reverse() {
 6     }
 7 
 8     public static void main(String[] args) {
 9         Scanner s = new Scanner(System.in);
10         System.out.println("Please input the flag :");
11 String str = s.next(); 12 System.out.println("Your input is :"); 13 System.out.println(str); 14 char[] stringArr = str.toCharArray(); 15 Encrypt(stringArr); 16 } 17 18 public static void Encrypt(char[] arr) { 19 ArrayList<Integer> Resultlist = new
ArrayList(); 20 21 for(int i = 0; i < arr.length; ++i) { 22 int result = arr[i] + 64 ^ 32; 23 Resultlist.add(result); 24 } 25 26 int[] KEY = new int[]{180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65}; 27 ArrayList<Integer> KEYList = new
ArrayList(); 28 29 for(int j = 0; j < KEY.length; ++j) { 30 KEYList.add(KEY[j]); 31 } 32 33 System.out.println("Result:"); 34 if (Resultlist.equals(KEYList)) { 35 System.out.println("Congratulations!"); 36 } else { 37 System.err.println("Error!"); 38 } 39 40 } 41 }

2. 大致的意思是:輸入的字串flag會被轉成字串列表,然後對每個元素進行加密。加密的方法是:每個元素加上64後再與32異或。加密完轉換成整型需與KEY各元素相等。所以對KEY中各元素異或32後減去64再轉char即可得到flag。

3. 解密程式碼如下:

 1 public class JavaReverseDecypto {
 2     public static void main(String[] args) {
 3         int[] KEY = new int[]{180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65};
 4         int len = KEY.length;
 5 
 6         char[] flag = new char[len];
 7         for (int i = 0; i < len; ++i) {
 8             flag[i] = (char) ((KEY[i] ^ 32) - 64);
 9             System.out.print(flag[i]);
10         }
11     }
12 }

4. 輸出結果為This_is_the_flag_!