• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+2 głosów
314 wizyt
pytanie zadane 25 września 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,630 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,630 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 644 wizyt
+7 głosów
5 odpowiedzi 1,621 wizyt
pytanie zadane 15 maja 2020 w Bezpieczeństwo, hacking przez Mirosław Zelent Nałogowiec (34,630 p.)
+2 głosów
1 odpowiedź 173 wizyt
pytanie zadane 11 stycznia 2022 w Algorytmy przez samek Nowicjusz (180 p.)

90,319 zapytań

138,924 odpowiedzi

311,159 komentarzy

60,027 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...