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 lcmimport randomclassPaillier:def__init__(self):self.cnt=1whileTrue: p, q =getPrime(512),getPrime(512)ifGCD(p*q,(p-1)*(q-1))==1:breakself.phi=lcm(p-1,q-1)self.n = p * qself.r={ r+1: random.randint(2,self.n-1)for r inrange(128)}defencrypt(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+=1return ct
Soal ini menerapkan Paillier cryptosystem. 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.