mystery-methods

Description

rev/mystery-methods (by Dread) | 293 points

vqx jung gb fnl urer

mysteryMethods.java

Analysis

import java.util.Base64;
import java.util.Scanner;

public class mysteryMethods{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Flag: ");
        String userInput = scanner.nextLine();
        String encryptedInput = encryptInput(userInput);

        if (checkFlag(encryptedInput)) {
            System.out.println("Correct flag! Congratulations!");
        } else {
            System.out.println("Incorrect flag! Please try again.");
        }
    }

    public static String encryptInput(String input) {
        String flag = input;
        flag = toBase64(flag, 345345345);
        flag = reverseStr(flag);
        flag = toBase64(flag, 00000);
        flag = shift(flag, 25);
        return flag;
    }

    public static boolean checkFlag(String encryptedInput) {
        return encryptedInput.equals("OS1QYj9VaEolaDgTSTXxSWj5Uj5JNVwRUT4vX290L1ondF1z");
    }

    public static String shift(String input, int amount) {
        StringBuilder result = new StringBuilder();
        for (char c : input.toCharArray()) {
            if (Character.isLetter(c)) {
                char base = Character.isUpperCase(c) ? 'A' : 'a';
                int offset = (c - base + amount) % 26;
                if (offset < 0) {
                    offset += 26;
                }
                c = (char) (base + offset);
            }
            result.append(c);
        }
        return result.toString();
    }

    public static String reverseStr(String xyz) {
        return new StringBuilder(xyz).reverse().toString();
    }

    public static String toBase64(String xyz, int integer) {
        return Base64.getEncoder().encodeToString(xyz.getBytes());
    }
}

Note: I renamed variables/functions for more readability

The Java code takes in input, performs encryption and compares to final output (which should be the flag).

To get the Flag we must reverse the encryption.

Encryption:

public static String encryptInput(String input) {
    String flag = input;
    flag = toBase64(flag, 345345345); // Convert flag to Base64
    flag = reverseStr(flag);          // Reverse string
    flag = toBase64(flag, 00000);     // Convert flag to Base64 (again)
    flag = shift(flag, 25);           // Shift characters by 25
    return flag;
}

Decryption would be Shift -> Base64Decode -> Reverse -> Base64Decode -> Flag

To reverse the ROT25 encryption, you simply need to apply ROT1 encryption to the text. ROT25 is essentially the same as ROT1, as shifting the letters by 25 positions in the alphabet is equivalent to shifting them by just one position.

Solution

In CyberChef

Last updated