Szyfrowanie klucza prywatnego

Regulamin forum
Uwaga! Poruszamy kwestie wyłącznie zgodne z prawem! Nie namawiamy do łamania prawa! Nie radzimy jak łamać prawo!
Początkujący
Posty: 5
Rejestracja: 27 kwietnia 2021
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

Szyfrowanie klucza prywatnego

Postautor: Mark24 » wtorek, 27 kwietnia 2021, 11:52

Witam
Krótkie pytanie o rodzaj szyfru (do użycia np. w C#, C++).

Otóż chcę zaszyfrować tekst (string) do szyfrogramu (też string), następnie szyfrogram odszyfrować kluczem do tekstu. Chciałbym, aby przy podaniu błędnego klucza – procedura odszyfrowująca też zrobiła output do tekstu i zakończyła działanie bez informacji o błędzie (że klucz był błędny).

Aktualnie trudność mam taką, że używając sprawdzonych procedur szyfrowania AES – gdy wpiszę nieprawidłowy klucz to procedura „sypie błędem”. Wtedy np. hacker przejdzie po wszystkich kombinacjach i wyłapie tą, która nie kończy się błędem. Gdyby każde deszyfrowanie kończyło się „sukcesem” czyli wygenerowaniem jakiegoś string-u, to hacker użyłby taki odszyfrowany string (klucz prywatny) np. 5 razy na giełdę, która by go po 6 razie zbanowała. A tak może w zaciszu domowym ustalić klucz do deszyfrowania, a później nim swobodnie rozporządzać.

Czy można prosić o jakiś namiar na taki temat szyfru zawsze działającego, jakąś podpowiedź?

bMh
Początkujący
Posty: 544
Rejestracja: 14 czerwca 2017
Reputacja: 352
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: Szczecin

Szyfrowanie klucza prywatnego

Postautor: bMh » wtorek, 27 kwietnia 2021, 12:56

Na pewno C# ma pythonowy odpowiednik "try" gdzie możesz wyrzucic output w razie błędów w dowolnej formie.

Początkujący
Posty: 5
Rejestracja: 27 kwietnia 2021
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

Szyfrowanie klucza prywatnego

Postautor: Mark24 » wtorek, 27 kwietnia 2021, 13:30

Tak, ok, tak właśnie robię i wyłapuję taki błąd instrukcją:

Kod: Zaznacz cały

try
{
   //ciało programu
}
catch (Exception e)
{
   Console.WriteLine("Error: {0}", e.Message);
}
Problem jednak w tym, że hacker też to wyłowi, popracuje kilka dni i znajdzie kombinację na wejściu, która na wyjściu nie da błędu i takim sposobem pozna zaszyfrowany klucz.
Myśle tu o szyfrach podstawieniowych, gdzie po deszyfrowaniu uzyskujemy tu zawsze jakiś ciąg zdeszyfrowany i nie wiadomo, czy on jest dobry czy nie, bo zawiera po prostu jakiś ciąg znaków, który za każdym razem może być kluczem prywatnym. Dopiero po użyciu takiego klucza (np. na giełdzie) giełda Ci odpowiada, czy wysłany klucz jest ok i masz tylko kilka prób, a nie 1000000000 …

Podejrzewam, że świat kryptografii rozwiązał ten problem, ale nie wiem jak, nie mam takiej wiedzy i zapytałem na forum, bo tu nieźli spece są od tego… :)

Wygadany
Awatar użytkownika
Posty: 593
Rejestracja: 8 lutego 2020
Reputacja: 1114
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: 7-bit secp256k1

Szyfrowanie klucza prywatnego

Postautor: garlonicon » wtorek, 27 kwietnia 2021, 13:37

Przede wszystkim zastanów się, czy rzeczywiście chcesz mieć klucz zaszyfrowany w taki sposób. Jeśli dojdziesz do wniosku, że jednak nie, to BIP-38 powinien wystarczyć.

Jeśli jednak koniecznie chcesz mieć klucz, który da się odszyfrować na wiele sposobów, to tak naprawdę wystarczy zwykłe dodawanie. Zaczynasz od 256-bitowego klucza prywatnego X, do którego dodajesz 256-bitowe zaszyfrowane hasło Y. Wynikiem jest X+Y (modulo liczba kluczy, czyli ffff...4141). Najprostsze, co możesz zrobić, to Y=SHA-256(hasło), no ale to nie jest zbyt bezpieczne, więc dobrze byłoby to czymś wzmocnić, co najmniej dorzucenie soli by się przydało, żeby atakujący nie jechał tablicami tęczowymi. Przy deszyfrowaniu wywołujesz wybraną funkcję na haśle i odejmujesz Y od zaszyfrowanego klucza (modulo liczba kluczy, czyli ffff...4141). W tym przypadku dodawanie i odejmowanie nie wpływa na wynik modulo, więc można to robić bezpiecznie.

Oprócz tego, samych danych nie polecam trzymać "na surowo", dobrze byłoby jakąś sumę kontrolną dorzucić do zaszyfrowanego tekstu, najlepiej z kodami korekcyjnymi, żeby dało się odzyskać klucz w zaszyfrowanej formie, nawet jeśli pomylisz pojedynczą literę przy zapisywaniu tego na przykład na kartce.

Ogólnie to odradzam tego typu klucze, bo jest spora szansa, że sam zapomnisz hasła, no ale jeśli koniecznie chcesz to zrobić, to opierając się na dowolnej przemiennej operacji (typu dodawanie) będzie to wystarczająco bezpieczne, zakładając że klucz prywatny oraz sól są całkowicie losowe, a użyte hasło jest wystarczająco silne.

Początkujący
Posty: 5
Rejestracja: 27 kwietnia 2021
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

Szyfrowanie klucza prywatnego

Postautor: Mark24 » wtorek, 27 kwietnia 2021, 13:47

bMh pisze: wtorek, 27 kwietnia 2021, 12:56 Na pewno C# ma pythonowy odpowiednik "try" gdzie możesz wyrzucic output w razie błędów w dowolnej formie.

Tak, ok, tak właśnie robię i wyłapuję taki błąd instrukcją:

Kod: Zaznacz cały

try
{
   //ciało programu
}
catch (Exception e)
{
   Console.WriteLine("Error: {0}", e.Message);
}
Problem jednak w tym, że hacker też to wyłowi, popracuje kilka dni i znajdzie kombinację na wejściu, która na wyjściu nie da błędu i takim sposobem pozna zaszyfrowany klucz.
Myślę tu o szyfrach podstawieniowych, gdzie po deszyfrowaniu uzyskujemy tu zawsze jakiś ciąg zdeszyfrowany i nie wiadomo, czy on jest dobry czy nie, bo zawiera po prostu jakiś ciąg znaków, który za każdym razem może być kluczem prywatnym. Dopiero po użyciu takiego klucza (np. na giełdzie) giełda Ci odpowiada, czy wysłany klucz jest ok i masz tylko kilka prób, a nie 1000000000 …

Podejrzewam, że świat kryptografii rozwiązał ten problem, ale nie wiem jak, nie mam takiej wiedzy i zapytałem na forum, bo tu nieźli spece są od tego…

Początkujący
Posty: 5
Rejestracja: 27 kwietnia 2021
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

Szyfrowanie klucza prywatnego

Postautor: Mark24 » wtorek, 27 kwietnia 2021, 14:13

garlonicon pisze: wtorek, 27 kwietnia 2021, 13:37 Przede wszystkim zastanów się, czy rzeczywiście chcesz mieć klucz zaszyfrowany w taki sposób. Jeśli dojdziesz do wniosku, że jednak nie, to BIP-38 powinien wystarczyć.
Garlonicon, dzięki za tak wyczerpującą odpowiedź.
Wynika z niej, że być może nie najlepszą amatorską drogę obrałem, więc korzystając z Twej uprzejmości – uszczegółowię problem, który być może da się rozwiązać zupełnie inaczej.

Otóż wykonuję zapytania API do pewnej giełdy. Tam dane ogólne można uzyskać poprzez fejkowego usera, ale np. stan swojego konta, prowizje i inne dane z prawdziwego konta można uzyskać podając w argumencie funkcji cały klucz API - prywatny i cały publiczny.
Nie chcę ich za każdym razem wpisywać z palca do swojego programu, chciałbym część klucza prywatnego zahardkodować i skompilować w kodzie programu, a część wpisywać za każdym razem z palca. W kodzie oczywiście nie chcę w sposób bezpośredni zapisywać części klucza prywatnego – dlatego chciałbym go zaszyfrować właśnie (jak ktoś zrobiłby deasemblację programu). I o tym szyfrowaniu piszę.

Najlepiej byłoby użyć w software obsługę klucza sprzętowego Ledger przez USB, ale na to nie mam na razie czasu.
Czy taki sposób działania z kluczem publicznym jest sensowny? (na tym forum autor pewnego software pisał, że tak właśnie robi…)

Wygadany
Awatar użytkownika
Posty: 593
Rejestracja: 8 lutego 2020
Reputacja: 1114
Reputacja postu: 
1
Napiwki za post: 0 BTC
Lokalizacja: 7-bit secp256k1

Szyfrowanie klucza prywatnego

Postautor: garlonicon » wtorek, 27 kwietnia 2021, 14:21

Dopiero po użyciu takiego klucza (np. na giełdzie) giełda Ci odpowiada, czy wysłany klucz jest ok i masz tylko kilka prób, a nie 1000000000
Niezupełnie, bo nawet jeśli sam klucz jest deszyfrowalny do wielu innych kluczy, no to jeśli na powiązanym adresie leżą jakiekolwiek monety, to da się to sprawdzić. Blockchain można przeglądać do woli, żeby to nie zadziałało, to giełda musiałaby nigdy tego klucza nie użyć. Oprócz tego, jeśli środki leżą na giełdzie, to bardziej bym się obawiał, że giełda je zwinie, niż że jakiś haker się włamie i to odszyfruje.
Podejrzewam, że świat kryptografii rozwiązał ten problem, ale nie wiem jak
Przykładowe rozwiązanie masz wyżej, tylko trzeba byłoby je dopieścić, żeby było rzeczywiście bezpieczne. No i też dobrze byłoby, żeby jakiś BIP na to powstał, zanim zaczniesz masowo tego używać. Ewentualnie można byłoby z istniejącego BIP-a po prostu wyrżnąć te kawałki, które odpowiadają za weryfikację. Warto jednak pamiętać, że tworzenie własnych rozwiązań kryptograficznych jest jak bawienie się zapałkami, siedząc na beczce prochu. Chodzi o to, że bardzo łatwo jest popełnić błąd. Zrobisz "modulo bias" i pozamiatane: https://bitcointalk.org/index.php?topic=5326468.0

Weteran
Awatar użytkownika
Posty: 1129
Rejestracja: 12 sierpnia 2017
Reputacja: 3357
Reputacja postu: 
2
Napiwki za post: 0 BTC

Szyfrowanie klucza prywatnego

Postautor: fusywszklanejkuli » wtorek, 27 kwietnia 2021, 15:57

Mark24 pisze: wtorek, 27 kwietnia 2021, 13:30 Podejrzewam, że świat kryptografii rozwiązał ten problem, ale nie wiem jak, nie mam takiej wiedzy i zapytałem na forum, bo tu nieźli spece są od tego… :)
Owszem, rozwiązaniem Twojego podstawowego problemu jest key stretching. Użytkownik wpisuje hasło, z hasła odpowiednio długo generowany jest klucz, i dopiero ten klucz służy do szyfrowania danych.

Początkujący
Posty: 5
Rejestracja: 27 kwietnia 2021
Reputacja: 0
Reputacja postu: 
0
Napiwki za post: 0 BTC

Szyfrowanie klucza prywatnego

Postautor: Mark24 » wtorek, 27 kwietnia 2021, 20:43

Dzięki za info, o [key stretching] trochę poczytałem, jest pewnie przede mną do ogarnięcia.
Zgodnie z Waszymi sugestiami nie będę kombinować nic nowego, ale „na szybko” użyję jednak szyfrowania AES, a jak będę miał czas – wejdę głębiej w temat.
Ściągnąłem wcześniej kilka fajnych przykładów używania AES w C#, najbardziej zwięzły wydaje się przykład: z GitHub: https://gist.github.com/magicsih/be06c2 ... 6feb96ce8c.
Zadziwia mnie, że w kilku różnych i niezależnych przykładach implementacji – podanie błędnego klucza deszyfrującego kończy się „wyłożeniem” programu i ludzie korzystając z takich klas – obejmują strategiczne metody klauzulą [try – catch] i tak ratują program przed wyłożeniem. To dosyć nieeleganckie rozwiązanie w klasie, którą trzeba ratować.
Na kolanie napisałem program przykładowy, w którym sprawdziłem sobie działanie szyfrowania AES. Działa to fajnie, z tym zastrzeżeniem, że też trzeba zastawiać pułapkę [try] jak klucz deszyfrujący jest ciut inny. Poniżej przykład w działaniu.

Obrazek

Czy może ktoś zna jakąś klasę obsługującą AES, która się przy tym nie „wysypuje”, ale ustawia jakąś flagę na false?

Wygadany
Awatar użytkownika
Posty: 593
Rejestracja: 8 lutego 2020
Reputacja: 1114
Reputacja postu: 
0
Napiwki za post: 0 BTC
Lokalizacja: 7-bit secp256k1

Szyfrowanie klucza prywatnego

Postautor: garlonicon » środa, 28 kwietnia 2021, 07:32

Czy może ktoś zna jakąś klasę obsługującą AES, która się przy tym nie „wysypuje”, ale ustawia jakąś flagę na false?
Wyjątki można łapać, a flagi ignorować. Ale to robi Twój program. Natomiast program hakera może tego nie robić. Chodzi o to, że AES sam w sobie ma już wbudowane sprawdzanie błędów, więc dane da się odszyfrować tylko w jeden sposób. Jeśli chcesz rzeczywiście mieć szyfr, który da się odszyfrować na wiele sposobów, to musisz pokombinować z algorytmem tak, aby nie było tam sprawdzania poprawności hasła.

Wróć do „Anonimowość i bezpieczeństwo w sieci”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość