Odszyfrowywanie zaszyfrowanego tekstu

Odpowiedz Nowy wątek
2019-03-11 18:20
0

Witam, mam taki oto kod

from secrets import randbelow
import string

def generate_scheme(output):
    litery = string.printable+'ąśżźłóęńć'

    for litera in litery:
        litera_i_jej_id_str = litera + ' => ' + str(randbelow(1000000))
        output.write((litera_i_jej_id_str + '\n').encode('utf8'))

# zaszyfrowywanie
def encrypt_text(text, crypto_scheme):
    przypisane_kody_do_liter = crypto_scheme.split('\n')
    kody = {}
    for przypisany_kod_do_litery in przypisane_kody_do_liter:
        if przypisany_kod_do_litery != '':
            (litera, kod) = przypisany_kod_do_litery.split(' => ')
            kody[litera] = kod
    wynik = ''
    for litera in text:
        wynik += kody[litera]+' '
    return wynik.strip().replace(' ', ',')

# deszyfrowanie
def decrypt_text(text, crypto_scheme):
    przypisane_litery_do_kodow = crypto_scheme.split('\n')
    litery = {}
    text = text.replace(',', '')
    for przypisana_litera_do_kodu in przypisane_litery_do_kodow:
        if przypisana_litera_do_kodu != '':
            (litera, kod) = przypisana_litera_do_kodu.split(' => ')
            litery[kod] = litera
    wynik = ''
    for litera in text:
        wynik += litery[litera]
    return wynik.strip()

#with open('encryption_scheme.txt', 'wb') as plik:
#   generate_scheme(plik)

with open('encryption_scheme.txt', 'rb') as plik:
    crypto_scheme = plik.read().decode('utf8')
    print(encrypt_text('żółć', crypto_scheme))
    print(decrypt_text(encrypt_text('żółć', crypto_scheme), crypto_scheme))

Jednak zamiast odszyfrować tekst podeja mi on tylko ććććććććććććććććććććććć

edytowany 1x, ostatnio: Cuckoo, 2019-03-11 18:34

Pozostało 580 znaków

2019-03-11 18:44
1

No to teraz weź debugger i zobacz gdzie się coś złego dzieje o_O Stawiasz breakpointy i przechodzisz po programie krok po kroku, linijka po linijce, patrząc na to jakie wyniki dostajesz. Nikt tego za ciebie robic nie będzie.
Jak skończysz dwójkę to nadal wołasz mamę?


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2019-03-11 18:45
Nigdy nie zrozumiem na wuj to twoje wymądrzanie się w postach. Ni to śmieszne, ni to zabawne. - slayer9 2019-03-11 19:01
Hmm może trochę źle sformułowałem posta. Wiem gdzie leży problem, ale nie mam pojęcia jak go naprawić. Konkretniej to chodzi o moment kiedy w pętli jest odczytywany tekst znak po znaku, jednak tych znaków do zmiany jest kilka na raz i nie są to stałe wartości typu 5, 4 lub 3 znaki. Raz jest ich 5, a raz 3 - Cuckoo 2019-03-11 19:05
Ale to nie jest błąd, przecież generujesz tam losowe liczby w zakresie do 1000000 to też takie dostajesz kody. Nie zgaduj tylko odpal ten debuger. Serio. Programowanie nie polega na zgadywaniu! - Shalom 2019-03-11 19:09
Ale powiedz mi, co da mi debuger skoro ja nie wiem jak zrobić to czego potrzebuję i tak szukałem już w google - Cuckoo 2019-03-11 19:17
Debuger pokaże ci dokładnie co i kiedy dzieje sie tam źle w tym kodzie. Szukanie w google to jakiś idiotyczny pomysł w tej sytuacji. To trochę jakbyś szukał w google czemu przypaliłem sobie dzisiaj zupę. W ogóle jakbyś otworzył ten twój plik encryption scheme to już byś widział co jest nie tak na początek. - Shalom 2019-03-11 19:44

Pozostało 580 znaków

2019-03-11 19:58
1
# coding=utf-8
import random
import string

def generate_scheme():
    return {c: str(random.randint(0, 1000000)) for c in string.printable + 'ąśżźłóęńć'}

def encrypt_text(text, crypto_scheme):
    return ",".join(crypto_scheme[c] for c in list(text))

def decrypt_text(text, crypto_scheme):
    reverse_mapping = {code: letter for (letter, code) in crypto_scheme.items()}
    return "".join(reverse_mapping[c] for c in text.split(","))

def main():
    scheme = generate_scheme()
    ct = encrypt_text("żółć ala ma kota sierotka ma rysia 1234", scheme)
    print(ct)
    print(decrypt_text(ct, scheme))

main()

Masz, kod przepisany na wersje dla ludzi. Robi to samo, ale bez błędnego pisania i czytania z pliku (ładujesz tam printable do pliku, w tym znaki nowej linii i spacje! gdybyś go chociaż raz otworzył to moze byś o tym wiedział...).
Wyjdź od tego kodu, bo on działa poprawnie.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 3x, ostatnio: Shalom, 2019-03-11 20:00
1. random.randint jest [a, b], secrets.randbelow (u niego) jest [0, n) – chciałeś random.randrange. 2. for c in list(text) wystarczy for c in text. - Mózg 2019-03-12 12:57
zupełna kosmetyka, jak się nudzisz to przeanalizuj raczej jego początkowy kod :P - Shalom 2019-03-12 13:37
Teraz jesteś Offby-One Kenobim. Nie przeszkadza Ci to? - Mózg 2019-03-12 13:43
Nie, bo to jest tu zupełnie arbitralne. Ta wartość jest wybrana żeby minimalizować ryzyko kolizji (które i tak nadal występuje, więc to i tak jest źle zrobione) - Shalom 2019-03-12 13:45
Jasne, rozumiem Twoją perspektywę. Problem polega na tym, że niedbalstwo ma duże znaczenie dla początkujących, którzy drobiazgowo analizują i zapamiętują kod bardziej doświadczonych kolegów. Twój przepisany do akceptowalnej formy kod – wbrew oczekiwaniom – nie robi tego samego (pomijam źródło losowości). - Mózg 2019-03-12 16:02
Serio nie rozumiem czemu zamiast napisać coś od siebie, dopieprzasz sie do zupełnie nieistotnego szczegółu. Ten range nie ma absolutnie żadnego znaczenia w kontekście kodu ani problemu autora. Jest równie nieistotny jak to że dałem tam random zamiast secrets. Jeszcze napisz moze że niepotrzebnie definiuje funkcje main, a przecież autor miał kod wrzucony w global scope. To też jakaś różnica, ale znów zupełnie nieistotna z punktu widzenia problemu :) Jeszcze raz: zachęcam żebyś w takim razie poprawił kod autora zgodnie ze sztuką. - Shalom 2019-03-12 16:55

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0