68 lines
2.2 KiB
Java
Executable File
68 lines
2.2 KiB
Java
Executable File
import java.util.*;
|
|
import javax.crypto.Cipher;
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
import java.security.*;
|
|
|
|
class VaultDoor7 {
|
|
public static void main(String args[]) {
|
|
VaultDoor7 vaultDoor = new VaultDoor7();
|
|
Scanner scanner = new Scanner(System.in);
|
|
System.out.print("Enter vault password: ");
|
|
String userInput = scanner.next();
|
|
String input = userInput.substring("picoCTF{".length(),userInput.length()-1);
|
|
if (vaultDoor.checkPassword(input)) {
|
|
System.out.println("Access granted.");
|
|
} else {
|
|
System.out.println("Access denied!");
|
|
}
|
|
}
|
|
|
|
// Each character can be represented as a byte value using its
|
|
// ASCII encoding. Each byte contains 8 bits, and an int contains
|
|
// 32 bits, so we can "pack" 4 bytes into a single int. Here's an
|
|
// example: if the hex string is "01ab", then those can be
|
|
// represented as the bytes {0x30, 0x31, 0x61, 0x62}. When those
|
|
// bytes are represented as binary, they are:
|
|
//
|
|
// 0x30: 00110000
|
|
// 0x31: 00110001
|
|
// 0x61: 01100001
|
|
// 0x62: 01100010
|
|
//
|
|
// If we put those 4 binary numbers end to end, we end up with 32
|
|
// bits that can be interpreted as an int.
|
|
//
|
|
// 00110000001100010110000101100010 -> 808542562
|
|
//
|
|
// Since 4 chars can be represented as 1 int, the 32 character password can
|
|
// be represented as an array of 8 ints.
|
|
//
|
|
// - Minion #7816
|
|
public int[] passwordToIntArray(String hex) {
|
|
int[] x = new int[8];
|
|
byte[] hexBytes = hex.getBytes();
|
|
for (int i=0; i<8; i++) {
|
|
x[i] = hexBytes[i*4] << 24
|
|
| hexBytes[i*4+1] << 16
|
|
| hexBytes[i*4+2] << 8
|
|
| hexBytes[i*4+3];
|
|
}
|
|
return x;
|
|
}
|
|
|
|
public boolean checkPassword(String password) {
|
|
if (password.length() != 32) {
|
|
return false;
|
|
}
|
|
int[] x = passwordToIntArray(password);
|
|
return x[0] == 1096770097
|
|
&& x[1] == 1952395366
|
|
&& x[2] == 1600270708
|
|
&& x[3] == 1601398833
|
|
&& x[4] == 1716808014
|
|
&& x[5] == 1734291511
|
|
&& x[6] == 960049251
|
|
&& x[7] == 1681089078;
|
|
}
|
|
}
|