Skip to main content

·322 words·2 mins
YarBurArt
Author
YarBurArt

Relatively Simple Algorithm
#

angstromCTF-2021
#

Задача 3(Relatively Simple Algorithm)
#

Подготовлено: lamchcl

Автор: lamchcl

Уровень сложности: Средний

Описание
#

RSA снова наносит удар! Источник

Подсказка
#

[https://ru.wikipedia.org/wiki/RSA_(cryptosystem)] (https://ru.wikipedia.org/wiki/RSA_(cryptosystem))

Решение
#

RSA достаточно хорошо описан в статье в Википедии.

Я использовал этот java-код ( взят из здесь):

Code
import java.math.BigInteger; //для работы с большими целыми (криптография)
import java.util.ArrayList; //для хранения последовательности байт (значений 0–255)
import java.util.Scanner; //для чтения ввода пользователя

public class RSA {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //cканер для чтения строк из консоли
        BigInteger N,phiN,e,d,m,c; //объявление чисел

        // cipertext c, plaintext m

        System.out.println("Insert N"); //ввод модуля

        N = new BigInteger (sc.nextLine()); //чтение

        System.out.println("Input e");//ввод модуля

        e = new BigInteger (sc.nextLine()); //чтение

        System.out.println("Input c"); //ввод модуля

        c = new BigInteger (sc.nextLine()); //чтение

        System.out.println("Input phi"); //ввод модуля

        phiN = new BigInteger (sc.nextLine()); //чтение

        sc.close(); //закрывает сканер

        d = e.modInverse(phiN); //вычисление 
        m = c.modPow(d, N); //дешифрование

        System.out.println("d = "+d);           
        System.out.println("m = "+m);

        System.out.println("m in base 256 = "+base256(m)); //Вывод результата функции base256 
        System.out.println("Convert with ASCII \n"+ Encode256(base256(m))); //Преобразует полученные байты в строку через кодирование в char.

    }
    static ArrayList<BigInteger> base256 (BigInteger M) {
        BigInteger base = new BigInteger("256");
        ArrayList<BigInteger> message256 = new ArrayList<BigInteger>();
        BigInteger sisa=M; //временная переменная для деления
        BigInteger k; //временная перепменная
        double z = Double.parseDouble(M.toString()); //Преобразует M в double чтобы взять логарифм
        double p = Math.floor(Math.log(z)/Math.log(256)); //Вычисляет индекс старшего байта;
        int r = (int) p;
        for (int j=0;j<=r;j++){
            k=sisa.mod(base);
            sisa=sisa.divide(base);
            message256.add(k);
        }
        return message256;
    }

    static String Encode256 (ArrayList<BigInteger> ascii) {
        String ascii256=""; //Накопитель результирующей строки
        int g;
        for (int i=0;i<ascii.size();i++) {
            g = Integer.parseInt(""+ascii.get(i)); //получение int
            ascii256=ascii256+( (char) g ); //Преобразует число 0..255 в символ Java 
        }
        return ascii256;
    }
}

В RSA:

$$ \phi\ = (p - 1)(q - 1) $$

Поэтому я использовал большое число calculator для вычисления значения phi. Затем я запустил приведенный выше код, и он выдал результат: }gnitupmoc_mutnauq_litnu_tsael_ta_llew_doog_llits_tub_dlo{ftca

Я изменил в Python

print("}gnitupmoc_mutnauq_litnu_tsael_ta_llew_doog_llits_tub_dlo{ftca"[::-1])

После чего получил флаг

Flag
#

actf{old_but_still_good_well_at_least_until_quantum_computing}