Siap Tempur!!

Description

WAH INI DIAAAAAA SISTEM ALAT ENKRIPSI MUTAKHIR DARI ISEKAI YANG DAPAT MEMPORAK-PORANDAKAN KETAHANAN KRIPTOGRAFI REPUBLIK INDONESIA!!!!

Author: AnYujin

nc 103.185.53.181 4255

Kita diberikan 2 file source code yakni Paillier.py dan soal.py serta sebuah service. Berikut adalah file source dari soal.

from Crypto.Util.number import *
from math import lcm
import random

class Paillier :
    def __init__(self):
        self.cnt=1
        while True:
            p, q = getPrime(512), getPrime(512)
            if GCD(p*q, (p-1)*(q-1)) == 1:
                break
        self.phi=lcm(p-1,q-1)
        self.n = p * q
        self.r= { r+1 : random.randint(2, self.n-1) for r in range(128) }

    def encrypt(self,msg,r):
        msg_len=len(msg)
        msg=bytes_to_long(msg.encode())
        gm=pow(self.n+1,msg,self.n**2)
        if r==0:
            rn=pow(self.r[msg_len],self.n+self.cnt,self.n**2)
        else:
            rn=pow(r,self.n+self.cnt,self.n**2)
        ct=(gm*rn)%(self.n**2)
        self.cnt+=1
        return ct

Soal ini menerapkan Paillier cryptosystemarrow-up-right. Untuk mendapatkan ciphertext ct, kita perlu menghitung ct = (g^m * r^n) mod n^2. Di soal ini, g^m dilambangkan dengan gm, sedangkan r^n dilambangkan dengan rn. Setelah menganalisis kode di atas untuk memeriksa adanya cacat implementasi yang menimbulkan kerentanan, ada beberapa hal yang ditemukan.

Di sini g di-set sebagai n+1. Dengan menggunakan teorema binomial:

Jika kita mendapatkan gm, maka kita bisa mendapatkan n. Di soal, kita bisa mengenkripsi pesan (misalnya 'A', nilai decimal = 65) dan memasukkan r secara custom. Kita bisa saja memasukkan r = 1 supaya ct == gm. Setelah itu, tinggal hitung n dengan n = (gm-1)//65.

Kerentanan berikutnya adalah n yang digunakan secara konstan. Di sini ada sistem untuk membedakan setiap enkripsi, yaitu menggunakan "count". Akan tetapi, sistem ini justru bisa kita manfaatkan. Misalnya saat ini count == 2, lalu kita encrypt flag sebanyak dua kali. Maka perhitungannya menjadi seperti berikut.

Nah, r sudah kita dapatkan. Berikutnya, kita bisa mendapatkan nilai gm dari flag.

Jika gm sudah didapatkan, maka kita dapat menghitung nilai m dengan mudah, seperti berikut.

Berikut adalah kode solver lengkapnya. Soal ini menggunakan service oracle, jadi nilai-nilai parameternya dapat berubah di setiap sesi.

Flag: TechnoFair11{R415ha_M4r5h4_M1ch13_Fl0R4_91T4}

Last updated