• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zabawa związana z szyfrowaniem XOR - challenge CTF

Object Storage Arubacloud
+2 głosów
596 wizyt
pytanie zadane 25 września 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,750 p.)
edycja 26 września 2022 przez Mirosław Zelent

To jest wątek ogłoszony w tym odcinku CTF(8):

https://www.youtube.com/watch?v=c5K1VoTRK5U

Można tutaj postować własne swoje rozwiązania (write-upy) challenge'u:

https://ctflearn.com/challenge/227

wykonane w przeróżnych językach programowania.

Oprócz tego można wykonać następujący program (szczegółowy opis w filmie):

Zadanie: Napisz program/skrypt szyfrujący (“zaszumiający”) wszystkie grafiki we wskazanym folderze, który:

  • Zapyta: jaka jest lokalizacja folderu?
  • Zapyta: jaka jest długość losowego klucza (w bitach)?
  • Po zaszyfrowaniu, klucz w formie binarnej (wydruk wszystkich zer i jedynek klucza w formie binarnej) pojawi się we wskazanym folderze w pliku: klucz.txt
  • Oczywiście możliwe jest “odszumienie” grafik, jeśli ktoś posiada klucz z pliku klucz.txt
  • Metadane EXIF tych zdjęć nie powinny ulec zniszczeniu (patrz odc. 4 serii CTF)

2 odpowiedzi

+2 głosów
odpowiedź 29 września 2022 przez slime3000fly Początkujący (400 p.)

Próbowałem zrobić ten program i natknąłem się na problem z odszumieniem grafiki. Po odszumieniu uzyskuje zniekształcony obraz i nie rozumiem dlaczego tak się dzieje. Jeśli ktoś mógłby mi pomóc to byłbym wdzięczny :)

 

def decode(key):
    from PIL import Image
    from tqdm import tqdm

    def xor_encrypting(color_in: str, key_in: str):
        if color_in == key_in:
            return '0'
        else:
            return '1'



    img=Image.open('secret.jpg')
    width = int(img.width)
    height = int(img.height)
    pixel_map = img.load()

    # file_key = open('key.txt')
    # key = file_key.read()


    pos = 0

    for i in tqdm(range(width),'decode'):
        for j in range(height):
            r, g, b = img.getpixel((i, j))
            color = bin(r)[2:].zfill(8) + bin(g)[2:].zfill(8) + bin(b)[2:].zfill(8)
            key24 = key[pos:pos+24]
            d = 0

            # making key for 1 pixel
            if len(key) != 24:
                if len(key) > 24:
                    key24 = key[pos:pos+24]
                    pos += 24
                    if len(key24) < 24:
                        pos = 0
                        while len(key24) < 24:
                            key24 = key24 + key[pos]
                            pos += 1

                # repet too short key
                while len(key24) < 24:
                    if d >= len(key)-1:
                        d = 0
                    key24 = key24 + key[d]
                    d += 1

            # decode
            new_color = ''
            for k in range(24):
                new_color += xor_encrypting(color[k], key24[k])

            pixel_map[i, j] = (int(new_color[0:8], 2), int(
                new_color[8:16], 2), int(new_color[16:24], 2))

    print(len(color))
    img.show()
    return pixel_map

file_key = open('key.txt')
key = file_key.read()

decode(key)

 

1
komentarz 1 października 2022 przez Mirosław Zelent Nałogowiec (34,750 p.)
Kod wygląda na dobry, natomiast warto pamiętać iż format JPG to jednak jest kompresja stratna, czyli oryginalne kolory "giną" podczas kompresji w trakcie save'owania pliku. Spróbuj użyć PNG i sprawdzić, czy wówczas deszyfrowanie okaże się nie generować żadnych artefaktów. Pozdrawiam serdecznie!
+2 głosów
odpowiedź 21 listopada 2022 przez Dynamic Bywalec (2,910 p.)

Witam, zdecydowałem się napisać prosty programik do testowania, ponieważ kiedy ustawiałem krótkie klucze, obraz nie był zaszumiony. wraz z wrostem długości klucza obraz się koduje. Aplikacja jest pisana na kolanie i ze względu braku czsu na szybko. Brakuje wielu zabezpieczeń np przed usunięciem klucza. (sam klucz jest ladowany ze scieżki z programem)

UWAGA, nie używać na ważnych zdjęciach, bo można łatwo usunąć/ nadpisać klucz! 

from PySide2.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QFileDialog, QMessageBox
import glob, os
from PIL import Image
import random

def create_msg(t="Mgs", m ="msg"):
    msg = QMessageBox()
    msg.setWindowTitle(t)
    msg.setText(m)
    msg.exec_()


class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.set_window()
        self.connect()
        self.files = []

    def connect(self):
        self.push_szukaj.clicked.connect(self.chose_folder)
        self.push_generuj.clicked.connect(self.gen_key)
        self.push_szyfruj.clicked.connect(self.proces)


    def chose_folder(self):
        path = QFileDialog.getExistingDirectory(self, "Select Directory")
        if path:
            self.line_folder.setText(path)
        self.take_paths()


    def take_paths(self):
        if self.line_folder.text() == '':
            create_msg("err", "Musisz wybrac sciezke")
        else:
            os.chdir(self.line_folder.text())
            for file in glob.glob("*.png"):
                self.files.append(self.line_folder.text() + '/' + file)


    def gen_key(self):
        if self.line_len.text() == '':
            create_msg("err", "Musisz uzyc jakiejs wartosci")
        else:
            dlugosc = int(self.line_len.text())
            key = ''.join([str(random.randint(0,1)) for x in range(dlugosc)])
            file = open(r'./key.txt', 'w')
            file.write(key)
            create_msg("klucz stworzony", "udalo sie utworzyc klucz")

    def proces(self):
        file = open(r'./key.txt', 'r')
        self.key = file.read()

        def return_key(f, to, poz):
            return int(self.key[f+poz:to+poz], 2)

        for img in self.files:
            obraz = Image.open(img)
            mapa_pikseli = obraz.load()
            SZER, WYS = obraz.size

            poz = 0
            for x in range(SZER):
                for y in range(WYS):
                    r, g, b = obraz.getpixel((x, y))

                    key_r = return_key(0, 8, poz)
                    key_g = return_key(8, 16, poz)
                    key_b = return_key(16, 24, poz)

                    new_r, new_g, new_b = r ^ key_r, g ^ key_g, b ^ key_b

                    poz += 24

                    if poz > len(self.key)-50:
                        poz = 0


                    mapa_pikseli[x, y] = (new_r, new_g, new_b)

            obraz.save(img)
            create_msg("Succes", "Udalo sie!")
    def set_window(self):
        self.setFixedSize(600, 110)
        self.label = QLabel(self)
        self.label.setText("Wybierz: ")
        self.label.setGeometry(30, 20, 51, 21)
        self.line_folder = QLineEdit(self)
        self.line_folder.setGeometry(90, 20, 371, 20)
        self.push_szukaj = QPushButton(self)
        self.push_szukaj.setText("Szukaj")
        self.push_szukaj.setGeometry(490, 20, 75, 23)
        self.push_generuj = QPushButton(self)
        self.push_generuj.setText("Generuj")
        self.push_generuj.setGeometry(160, 60, 121, 23)
        self.line_len = QLineEdit(self)
        self.line_len.setGeometry(40, 60, 81, 20)
        self.push_szyfruj = QPushButton(self)
        self.push_szyfruj.setText("Szyfruj")
        self.push_szyfruj.setGeometry(330, 60, 111, 23)

app = QApplication()
window = MyWin()
window.show()
app.exec_()

 

Podobne pytania

+5 głosów
3 odpowiedzi 829 wizyt
+7 głosów
5 odpowiedzi 2,180 wizyt
pytanie zadane 15 maja 2020 w Bezpieczeństwo, hacking przez Mirosław Zelent Nałogowiec (34,750 p.)
+2 głosów
1 odpowiedź 363 wizyt
pytanie zadane 11 stycznia 2022 w Algorytmy przez samek Nowicjusz (180 p.)

92,539 zapytań

141,382 odpowiedzi

319,477 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...