Discussion:
Szyfrowanie z solą
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
osobliwy nick
2019-11-05 18:44:51 UTC
Permalink
Zastanawiam się nad pewnym schematem algorytmu szyfrującego. Nie spotkałem tego rodzaju schematu w żadnych stosowanych algorytmach, co mnie trochę dziwi, bo nie jest to trudna idea.

Pomysł jest następujący. Załóżmy, że mamy jakąś funkcję szyfrującą. I szyfrujemy wiadomości w blokach powiedzmy 20-bitowych. Ale dokonujemy pewnej operacji - podmieniamy połowę bitów na kompletnie losowe. Tym samym na realną wiadomość mamy do dyspozycji tylko 10 bitów. Zaletą jest to, że zmienia to kompletnie wynik końcowy szyfrowania, połowa bitów już na wstępie jest losowa. Zaś ta, która zostaje, jest jeszcze dodatkowo szyfrowana, razem z losową połową.

Jak tego dokonać? Otóż musimy posłużyć się w tym celu jakąś funkcją porządkowo - hashującą. To co robimy, to hashujemy wartości 1, 2, 3, ..., n (tworzymy tyle bloków ile trzeba, aby zmieścić wiadomość). W wyniku dostajemy kolejne 20-bitowe bloki. Hashowanie musi być unikalne, to znaczy - musi to być funckja hasjująca ze zmiennym kluczem, których musi być wiele. Chodzi o to, żeby atakujący nie był w stanie stwierdzić jak zahashowano np. liczbę jeden i jaki dokładnie blok 20-bitowy ta liczba daje (musi mieć do tego klucz). Myślę, że bardzo łatwo stworzyć taką funkcję - wystarczy chociażby posłużyć się zwykłą funkcją szyfrującą i dodać jakieś operacje XOR w kolejnych rundach (albo jakoś wymieszać proces szyfrowania), tak, żeby nie dało się jej już odszyfrować jak dotychczas, według kluczy (ja mam taką funkcję). Ważne jest to, aby średnio funkcja taka dawała dla każdej liczby 1, 2, 3,... połowę bitów w postaci 1 i połowę w postaci 0. Wówczas możemy ustalić, że powiedzmy zawsze podstawiamy w miejsca 0 losowe bity. Zaś w miejsca 1 wstawiamy bity naszej wiadomości. Następnie szyfrujemy całość we właściwej funkcji szyfrującej.

Odbiorca, który chce odszyfrować wiadomość oblicza sobie kolejno bloki zaczynając od 1, czyli po prostu hashuje liczbę 1 i dzięki temu wie które bity już pod odszyfrowaniu to wiadomość, a które pominąć, bo są losowe. Tak jak pisałem, zmienia to kompletnie wynik szyfrowania. Bez znajomości porządkowej funkcji hashującej i konkretnego klucza hashującego odtworzenie zaszyfrowanej wiadomości jest praktycznie niemożliwe, bo oryginalne bity wiadomości mogą być nie tyko w różnych miejscach 20-bitowego bloku, ale są też wymieszane z losowymi bitami. Z kolei uzyskanie kluczy funkcji hasjującej, pomimo, że dla każdej sesji hashujemy te same liczby 1, 2, 3,... również jest trudne, bo zahashowane wyniki są następnie wypełniane w połowie wiadomością, a połowie losowym ciągiem i później jeszcze szyfrowane.

W szczególności strony mogą ustalić jakąś unikalną, losową permutację liczb od 1 do n, najlepiej równą średniej planowanej liczbie bloków, która będzie przesyłana w trakcie sesji. Załóżmy, że najczęściej strony przesyłają między sobą 100 bloków. Wówczas permutacja powinna liczyć 100 liczb. I każdy blok w danej sesji powinien być szyfrowany poczynając od wyznaczenia 20-bitowego bloku dla pierwszej liczby z tej permutacji. W szczególności permutację można zmieniać w ramach każdej sesji, bez konieczności zmiany kluczy albo ustalić tak długą permutację, że przez lata nie zostanie ona zrealizowana. Jeśli strony zakończyły szyfrowanie na np. 100 elemencie permutacji, to kolejną sesję zaczynają od elementu 101. Każda wiadomość będzie wówczas szyfrowana w sposób unikalny, pomimo, że tymi samymi kluczami.

Wydaje mi się to prosta idea, choć opis zajmuje trochę miejsca. Chodzi po prostu o funkcję hashująco-porządkową poprzedzającą szyfrowanie każdego bloku i mówiącą jak ten blok zaszyfrować. Dlaczego nikt takiego pomysłu jak dotychczas nie zrealizował? A jedynym zastosowaniem mieszania wiadomości z losowym ciągiem bitów, który znam jest dodawanie soli do haseł, które są hashowane. Dlaczego nie dodawać soli do szyfrowanych wiadomości?
M.M.
2019-11-05 20:39:37 UTC
Permalink
Post by osobliwy nick
Zastanawiam się nad pewnym schematem algorytmu szyfrującego. Nie spotkałem tego rodzaju schematu w żadnych stosowanych algorytmach, co mnie trochę dziwi, bo nie jest to trudna idea.
Pomysł jest następujący. Załóżmy, że mamy jakąś funkcję szyfrującą. I szyfrujemy wiadomości w blokach powiedzmy 20-bitowych. Ale dokonujemy pewnej operacji - podmieniamy połowę bitów na kompletnie losowe.
Osobiście soli używam do funkcji skrótu. Używam w dwóch wersjach stałej i
zmiennej. Stałą sól przechowuję jako tajną, a losową trzymam jako jawną
wraz z wartością funkcji skrótu. O ile nie wycieknie stała sól, to nie
nie można odtworzyć danych hashowanych, nawet metodą brut-force. Jak wycieknie,
to losowa sól uniemożliwia stosowanie tęczowych tablic - ale to dotyczy
funkcji skrótu.


Czy to jakoś też można zastosować do szyfrowania i deszyfrowania - nie wiem.
Cytat z wiki:
[
Podczas szyfrowania odwracalnego
Podczas szyfrowania symetrycznego i asymetrycznego sól może być dodawana do klucza. Dzięki temu zwiększa się bezpieczeństwo, ponieważ im dłuższy klucz, tym bezpieczniejszy. Jednak wzrost bezpieczeństwa jest mniejszy niż w przypadku użycia całkowicie losowego klucza o tej długości.
]


[...]
Pozdrawiam
osobliwy nick
2019-11-06 02:17:01 UTC
Permalink
Post by M.M.
Czy to jakoś też można zastosować do szyfrowania i deszyfrowania - nie wiem.
[
Podczas szyfrowania odwracalnego
Podczas szyfrowania symetrycznego i asymetrycznego sól może być dodawana do klucza. Dzięki temu zwiększa się bezpieczeństwo, ponieważ im dłuższy klucz, tym bezpieczniejszy. Jednak wzrost bezpieczeństwa jest mniejszy niż w przypadku użycia całkowicie losowego klucza o tej długości.
Czyli raczej nie ma takiej, przynajmniej powszechnie znanej metody. Albo dodaje się sól do klucza, albo do hasła. Nie istnieją zaś powszechnie znane algorytmy, w których dodawałoby się sól do wiadomości. W najprostszej formie można to zrobić tak, że sól stanowi pierwszą połowę bitów, a druga połowa, to właściwa wiadomość. Wówczas w ogóle nie musimy trzymać, ani ujawniać tej soli. Stosujemy ją jednorazowo dla każdego szyfrowanego bloku.

Możliwe, że wobec tego chodzi o to, że jest to po prostu mało wydajne rozwiązanie. Zamiast poświęcać czas na szyfrowanie wiadomości, z których połowa jest do zignorowania, może lepiej zwykle wydłużyć klucz albo dodać kilka rund algorytmu. Nawet jeśli sól jest jednorazowa, to 10-bitowy ciąg i tak powtórzy się po maks. 1024 przypadkach użycia. Nie potrafię stwierdzić, czy to dobry, czy zły pomysł.

Weźmy najprostszy przypadek szyfru. Sieć feistela w trybie sprzężenia zwrotnego. Funkcją szyfrującą niech będzie klucz 20-bitowy, który xorujemy z wiadomością. Robimy powiedzmy 5 rund (każda runda ma swój klucz). 10 początkowych bitów to losowy ciąg, z drugie 10 to wiadomość. Co lepiej zrobić - odpuścić solenie i szyfrować 20-bitowe bloki wiadomości, a za to dodać np. kilka rund do algorytmu, czy jednak solić? Ile rund takiego algorytmu trzeba, żeby uzyskać efekt równoważny soleniu połowy z 20-bitowych bloków? Na pewno da się to oszacować, tylko nie wiem jak się do tego zabrać.
bartekltg
2019-11-06 10:11:49 UTC
Permalink
Post by osobliwy nick
Post by M.M.
Czy to jakoś też można zastosować do szyfrowania i deszyfrowania - nie wiem.
[
Podczas szyfrowania odwracalnego
Podczas szyfrowania symetrycznego i asymetrycznego sól może być dodawana do klucza. Dzięki temu zwiększa się bezpieczeństwo, ponieważ im dłuższy klucz, tym bezpieczniejszy. Jednak wzrost bezpieczeństwa jest mniejszy niż w przypadku użycia całkowicie losowego klucza o tej długości.
Czyli raczej nie ma takiej, przynajmniej powszechnie znanej metody. Albo dodaje się sól do klucza, albo do hasła. Nie istnieją zaś powszechnie znane algorytmy, w których dodawałoby się sól do wiadomości.
Technika ogolnie nazywa się padding
https://en.wikipedia.org/wiki/Padding_(cryptography)
Można tylko dopełniać do długości bloku, ale można
i rozdmuchiwac wiadomość x2.
Post by osobliwy nick
Możliwe, że wobec tego chodzi o to, że jest to po prostu mało wydajne rozwiązanie. Zamiast poświęcać czas na szyfrowanie wiadomości, z których połowa jest do zignorowania, może lepiej zwykle wydłużyć klucz albo dodać kilka rund algorytmu. Nawet jeśli sól jest jednorazowa, to 10-bitowy ciąg i tak powtórzy się po maks. 1024 przypadkach użycia. Nie potrafię stwierdzić, czy to dobry, czy zły pomysł.
Zalezy od metody szyfrowania. Dla jednych metod nie ma to znaczenia,
dla drugich utrudnia przeciwnikowi analizę.


pzdr
bartekltg
osobliwy nick
2019-11-06 19:05:00 UTC
Permalink
Post by bartekltg
Post by osobliwy nick
Post by M.M.
Czy to jakoś też można zastosować do szyfrowania i deszyfrowania - nie wiem.
[
Podczas szyfrowania odwracalnego
Podczas szyfrowania symetrycznego i asymetrycznego sól może być dodawana do klucza. Dzięki temu zwiększa się bezpieczeństwo, ponieważ im dłuższy klucz, tym bezpieczniejszy. Jednak wzrost bezpieczeństwa jest mniejszy niż w przypadku użycia całkowicie losowego klucza o tej długości.
Czyli raczej nie ma takiej, przynajmniej powszechnie znanej metody. Albo dodaje się sól do klucza, albo do hasła. Nie istnieją zaś powszechnie znane algorytmy, w których dodawałoby się sól do wiadomości.
Technika ogolnie nazywa się padding
https://en.wikipedia.org/wiki/Padding_(cryptography)
Można tylko dopełniać do długości bloku, ale można
i rozdmuchiwac wiadomość x2.
Post by osobliwy nick
Możliwe, że wobec tego chodzi o to, że jest to po prostu mało wydajne rozwiązanie. Zamiast poświęcać czas na szyfrowanie wiadomości, z których połowa jest do zignorowania, może lepiej zwykle wydłużyć klucz albo dodać kilka rund algorytmu. Nawet jeśli sól jest jednorazowa, to 10-bitowy ciąg i tak powtórzy się po maks. 1024 przypadkach użycia. Nie potrafię stwierdzić, czy to dobry, czy zły pomysł.
Zalezy od metody szyfrowania. Dla jednych metod nie ma to znaczenia,
dla drugich utrudnia przeciwnikowi analizę.
pzdr
bartekltg
Ok, czyli wszystko jasne. Tak myślałem, że musi to być znana koncepcja. Problemem jest tu jednak określenie gdzie w wiadomości zastosujemy padding. W najprostszym przypadku można się z góry umówić, że wypełniamy losowo pierwszą połowę bitów albo np. co drugi bit. Bardziej skomplikowany sposób to zmienne pozycje bitów i różne liczby bitów do wypełnienia losowo w zależności do tego, który blok z kolei szyfrujemy. Tutaj też trzeba jednak to określić z góry.

Idealną metodą byłoby zmieniane paddingu za każdym razem. Można to zrobić przesyłając sobie losowe permutacje i szyfrując je według niezależnych kluczy (tak naprawdę hashując), które ustali się razem z właściwymi kluczami szyfrującymi. Pierwsza zaszyfrowania liczba permutacji określa rozkład i porządek szyfrowania pierwszego bloku na podstawie liczby zer i jedynek, które otrzymaliśmy itd. Tylko, że w tej metodzie strony muszą ustalić wcześniej ze sobą permutacje. Teoretycznie, jeśli permutacje wyciekną i tak nic wielkiego się nie dzieje, bo atakujący nadal nie zna kluczy funkcji hashującej i kluczy funkcji szyfrującej, ale ma ułatwione zadanie.

A najlepiej ustalić tak długie permutacje, że nigdy nie zostaną wyczerpane. Strony musiałyby tylko zapisywać, na którym elemencie permutacji skończyły padding. I w kolejnej sesji hashować kolejny element permutacji (w celu ustalenia bloku określającego porządek paddingu). Takie szyfrowanie byłoby unikalne ze względu na unikalny padding dla każdego bloku. Książka zawiera około 3 mln bitów, to daje 150000 bloków 20-bitowych. Jeśli przez cały okres komunikacji nie wyślemy więcej niż połowę książki wiadomości, to należałoby przechowywać permutację złożoną ze 150000 elementów, najlepiej 20-bitowych. Czyli trzeba by przechowywać po prostu dane o wielkości książki. Nie wiem, czy to problematyczne.
osobliwy nick
2019-11-07 11:46:58 UTC
Permalink
Właściwie już mam pomysł jak uczynić padding unikalnym dla każdej sesji. Zakładając, że mamy przyzwoity algorytm szyfrujący działający w sieci feistela możemy po prostu szyfrować 2 razy (oczywiście dla poprawienia jakości szyfrowania, bo jeśli algorytm sam w sobie jest słaby, to pewnie żaden padding go nie uratuje). Najpierw szyfrujemy wiadomość pierwszym zestawem kluczy - algorytmem A1, ale tylko po to, aby wykorzystać uzyskany wynik do paddingu. Wynik dzielimy na bloki i wszystkie 0 szyfru podmieniamy na już właściwą wiadomość, zaś 1 zamieniamy na losowe wartości. Dopiero takie bloki szyfrujemy już właściwym algorytmem A2 (z innym, niezależnym zestawem kluczy) i wysyłamy do odbiorcy. Ten z kolei po odszyfrowaniu wiadomości musi ustalić, które bity zignorować jako losowe, ale nie jest w stanie tego zrobić, jeśli nie wie co było na wejściu. Chyba, że znałby pad - czyli rozkład/miejsca i wartości losowych bitów. A te dane mogłyby zostać przesłane do odbiorcy zaszyfrowane, razem w wiadomością algorytmem A2, już bez paddingu, bez wielkiego ryzyka. Bowiem de facto byłyby losowym ciągiem bitów i to jednorazowym dla danej sesji.
M.M.
2019-11-07 15:08:29 UTC
Permalink
Post by osobliwy nick
Właściwie już mam pomysł jak uczynić padding unikalnym dla każdej sesji. Zakładając, że mamy przyzwoity algorytm szyfrujący działający w sieci feistela możemy po prostu szyfrować 2 razy (oczywiście dla poprawienia jakości szyfrowania, bo jeśli algorytm sam w sobie jest słaby, to pewnie żaden padding go nie uratuje). Najpierw szyfrujemy wiadomość pierwszym zestawem kluczy - algorytmem A1, ale tylko po to, aby wykorzystać uzyskany wynik do paddingu. Wynik dzielimy na bloki i wszystkie 0 szyfru podmieniamy na już właściwą wiadomość, zaś 1 zamieniamy na losowe wartości. Dopiero takie bloki szyfrujemy już właściwym algorytmem A2 (z innym, niezależnym zestawem kluczy) i wysyłamy do odbiorcy. Ten z kolei po odszyfrowaniu wiadomości musi ustalić, które bity zignorować jako losowe, ale nie jest w stanie tego zrobić, jeśli nie wie co było na wejściu. Chyba, że znałby pad - czyli rozkład/miejsca i wartości losowych bitów. A te dane mogłyby zostać przesłane do odbiorcy zaszyfrowane, razem w wiadomością algorytmem A2, już bez paddingu, bez wielkiego ryzyka. Bowiem de facto byłyby losowym ciągiem bitów i to jednorazowym dla danej sesji.
Jest kilka pułapek. Po prostu zaszyfruj dłuższym kluczem i, jeśli możecie, to
nie udostępniajcie klucza publicznego, albo zaszyfrujcie jakimś algorytmem
symetrycznym.

Pozdrawiam
osobliwy nick
2019-11-07 20:43:38 UTC
Permalink
Post by M.M.
Jest kilka pułapek. Po prostu zaszyfruj dłuższym kluczem i, jeśli możecie, to
nie udostępniajcie klucza publicznego, albo zaszyfrujcie jakimś algorytmem
symetrycznym.
Jest kilka pułapek. Po prostu zaszyfruj dłuższym kluczem i, jeśli możecie, to
nie udostępniajcie klucza publicznego, albo zaszyfrujcie jakimś algorytmem
symetrycznym.
Ogólnie, to właśnie próbuję stworzyć taki symetryczny algorytm. I zastanawiam się na różnymi opcjami. Można zwiększać klucze, ale szukam jeszcze innej sensownej alternatywy.

Szyfrowanie losowego ciągu może się odbywać także trzecim zestawem kluczy A3, żeby nie narażać A2. Co więcej na podstawie tego ciągu można np. po każdej sesji modyfikować klucze A3. Wówczas za każdym razem z zaszyfrowaną wiadomością będzie przesyłany dosyć losowy ciąg bitów, który będzie ponadto determinował zmianę kluczy A3. Załóżmy, że szyfrujemy wiadomość 0101010101. Najpierw trafia na algorytm A1, który zmienia ją na np. 0011001100. I teraz zera wypełniamy naszą wiadomością (mamy na to sześć 0, resztę tego bloku zaszyfrujemy w kolejnym bloku), a jedynki zmieniamy na losowe wartości (np. 01 i 11), np. 0101011101. I to szyfrujemy za pomocą głównego algorytmu A2. Dodatkowo musimy wysłać losowy ciąg, który zastosowaliśmy. W tym celu oznaczamy bity, które należy zmienić za pomocą 1, zaś te, które należy zostawić oznaczamy 0, czyli mamy 0110010001. Szyfrujemy to za pomocą A3.

Wektor 0110010001 nie niesie ze sobą żadnych informacji na temat tego co jest w miejscach oznaczonych liczbami 0 lub 1. Mówi tylko - jeśli masz 0, to pozostaw bit, który masz (niezależnie, czy było to 0, czy 1), a jeśli 1, to zmień bit. Dopiero po jego użyciu na wektorze 0101011101 dostajemy 0011001100. I dopiero teraz możemy odtworzyć wiadomość 010101.
M.M.
2019-11-07 23:05:51 UTC
Permalink
Post by osobliwy nick
Post by M.M.
Jest kilka pułapek. Po prostu zaszyfruj dłuższym kluczem i, jeśli możecie, to
nie udostępniajcie klucza publicznego, albo zaszyfrujcie jakimś algorytmem
symetrycznym.
Jest kilka pułapek. Po prostu zaszyfruj dłuższym kluczem i, jeśli możecie, to
nie udostępniajcie klucza publicznego, albo zaszyfrujcie jakimś algorytmem
symetrycznym.
Ogólnie, to właśnie próbuję stworzyć taki symetryczny algorytm. I zastanawiam się na różnymi opcjami. Można zwiększać klucze, ale szukam jeszcze innej sensownej alternatywy.
Pytanie brzmi: po co, jakie korzyści z tego będą? Jeśli jesteś dobrym
teoretykiem i poszukujesz nowych algorytmów kryptograficznych, to od tej
pory ja przyjmuję rolę pytającego :)

W praktyce naprawdę wystarczy mocno zwiększyć długość kluczy i/lub przekazać
klucz publiczny niezgodnie z ideą, czyli nie wszystkim, ale w bezpieczny
sposób tylko osobie z którą będzie się wymieniało danymi. Stanowi to
odpowiednik szyfrowania symetrycznego z kluczem RSA.
Post by osobliwy nick
Szyfrowanie losowego ciągu może się odbywać także trzecim zestawem kluczy A3, żeby nie narażać A2. Co więcej na podstawie tego ciągu można np. po każdej sesji modyfikować klucze A3. Wówczas za każdym razem z zaszyfrowaną wiadomością będzie przesyłany dosyć losowy ciąg bitów, który będzie ponadto determinował zmianę kluczy A3.
I tak, i tak bardzo podatne na atak metodą 'człowiek w środku', i podatne na
to samo co RSA. Więc ponawiam pytanie, po co?

Załóżmy, że szyfrujemy wiadomość 0101010101. Najpierw trafia na algorytm A1, który zmienia ją na np. 0011001100. I teraz zera wypełniamy naszą wiadomością (mamy na to sześć 0, resztę tego bloku zaszyfrujemy w kolejnym bloku), a jedynki zmieniamy na losowe wartości (np. 01 i 11), np. 0101011101. I to szyfrujemy za pomocą głównego algorytmu A2. Dodatkowo musimy wysłać losowy ciąg, który zastosowaliśmy. W tym celu oznaczamy bity, które należy zmienić za pomocą 1, zaś te, które należy zostawić oznaczamy 0, czyli mamy 0110010001. Szyfrujemy to za pomocą A3.
Post by osobliwy nick
Wektor 0110010001 nie niesie ze sobą żadnych informacji na temat tego co jest w miejscach oznaczonych liczbami 0 lub 1. Mówi tylko - jeśli masz 0, to pozostaw bit, który masz (niezależnie, czy było to 0, czy 1), a jeśli 1, to zmień bit. Dopiero po jego użyciu na wektorze 0101011101 dostajemy 0011001100. I dopiero teraz możemy odtworzyć wiadomość 010101.
A po prostu zrobić xor danych z bardzo długim kluczem?

Pozdrawiam
osobliwy nick
2019-11-07 23:54:14 UTC
Permalink
Post by M.M.
Pytanie brzmi: po co, jakie korzyści z tego będą? Jeśli jesteś dobrym
teoretykiem i poszukujesz nowych algorytmów kryptograficznych, to od tej
pory ja przyjmuję rolę pytającego :)
Mam pewien algorytm, funkcję szyfrującą. Ale wydaje mi się ona zbyt prosta. To jedna rzecz. Druga sprawa, to fakt, że funkcje te mają takie właściwości, że zmiana choćby jednego bitu powoduje nieprzewidywalne zmiany na wyjściu. Efekt jest podobny do ciągów generowanych w ciągach Collatza. Liczba 111 daje kompletnie inny ciąg, aniżeli liczba 1101. Stąd uparłem się na wstrzykiwanie do szyfrowanych bloków jakichś losowych pakietów, sądzę, że przynosi to dużo korzyści.

Ale nie chcę tego robić w zbyt trywialny sposób. Kilka takich sposobów tu opisałem i można je wymyślić na poczekaniu. Tylko, że, jeśli nie będą one zrobione w sprytny sposób, to tylko utrudnią atakującemu nieco zadanie, a nie będą stanowić jakościowej różnicy. Już sam fakt, że zastosowanie mojego pomysłu implikuje szyfrowanie zmiennych bloków tekstu jawnego jest nietypowy (bo nigdy nie wiemy ile dokładnie zer i jedynek dostaniemy na wyjściu po zaszyfrowaniu danego bloku tekstu jawnego). To może być trudne do złamania.
Post by M.M.
Post by osobliwy nick
Szyfrowanie losowego ciągu może się odbywać także trzecim zestawem kluczy A3, żeby nie narażać A2. Co więcej na podstawie tego ciągu można np. po każdej sesji modyfikować klucze A3. Wówczas za każdym razem z zaszyfrowaną wiadomością będzie przesyłany dosyć losowy ciąg bitów, który będzie ponadto determinował zmianę kluczy A3.
I tak, i tak bardzo podatne na atak metodą 'człowiek w środku', i podatne na
to samo co RSA. Więc ponawiam pytanie, po co?
Ostatecznie, jeśli zaangażujemy do algorytmu trzy pod-algorytmy A1, A2, A3, każdy mający np. po 10 rund w sieci feistela, sądzę, że zwiększy to skuteczność bardziej, niż gdybyśmy posłużyli się jednym algorytmem w podstawowej wersji, bez paddingu i zwiększyli liczbę rund do 30 albo proporcjonalnie zwiększyli klucze. Ale nie umiem tego oszacować. Jeżeli się mylę, to oczywiście lepiej po prostu zwiększyć klucze lub liczbę rund, ale myślę, że tak nie jest.

Podczas, gdy dla 30 rund atakujący po prostu musi spróbować złamać klucze albo szukać jakichś wzorów w wynikach, jeśli np. zdobędzie teksty jawne, to dla rozłożenia tego na A1, A2, A3 w opisany przeze mnie sposób zadanie jest o wiele bardziej złożone.

Co do podatności na atak "człowiek w środku", to chcę to zaprojektować tak, aby nie było takiego problemu. Zakładam, że wektor losowy zaszyfrowany za pomocą A3 byłby wysyłany razem z zaszyfrowaną wiadomością. Nie trzeba by uzgadniać niczego wcześniej.
Post by M.M.
A po prostu zrobić xor danych z bardzo długim kluczem?
To mi się wydaje za proste. Zwykłe xorowanie nie wystarczy, żeby szyfr był nie do złamania. Zresztą xorowanie i tak następuje w kolejnych rundach sieci feistela, w której ma działać algorytm.
M.M.
2019-11-08 02:12:35 UTC
Permalink
On Friday, November 8, 2019 at 12:54:16 AM UTC+1, osobliwy nick wrote:
[...]
Post by osobliwy nick
To mi się wydaje za proste. Zwykłe xorowanie nie wystarczy, żeby szyfr był nie do złamania. Zresztą xorowanie i tak następuje w kolejnych rundach sieci feistela, w której ma działać algorytm.
Ale nie jest proste. Wręcz dowodzi się, że jest niemożliwe do złamania, o ile
tylko klucz jest tajny i wystarczająco długi. Prostota czasami stanowi zaletę - w
tym sensie to jest proste, bo prosty algorytm: robimy xora i trzymamy klucz w
tajemnicy.

Pozdrawiam
osobliwy nick
2019-11-08 16:56:35 UTC
Permalink
Post by M.M.
[...]
Post by osobliwy nick
To mi się wydaje za proste. Zwykłe xorowanie nie wystarczy, żeby szyfr był nie do złamania. Zresztą xorowanie i tak następuje w kolejnych rundach sieci feistela, w której ma działać algorytm.
Ale nie jest proste. Wręcz dowodzi się, że jest niemożliwe do złamania, o ile
tylko klucz jest tajny i wystarczająco długi. Prostota czasami stanowi zaletę - w
tym sensie to jest proste, bo prosty algorytm: robimy xora i trzymamy klucz w
tajemnicy.
Ale chodzi Ci o tajny, losowy ciąg bitów ustalony razem z kluczami raz na zawsze?

W trybie CFB jest już stosowany wektor losowy inicjujący, więc nie wiem, czy warto to jeszcze dublować.
M.M.
2019-11-09 22:32:37 UTC
Permalink
Post by osobliwy nick
Post by M.M.
[...]
Post by osobliwy nick
To mi się wydaje za proste. Zwykłe xorowanie nie wystarczy, żeby szyfr był nie do złamania. Zresztą xorowanie i tak następuje w kolejnych rundach sieci feistela, w której ma działać algorytm.
Ale nie jest proste. Wręcz dowodzi się, że jest niemożliwe do złamania, o ile
tylko klucz jest tajny i wystarczająco długi. Prostota czasami stanowi zaletę - w
tym sensie to jest proste, bo prosty algorytm: robimy xora i trzymamy klucz w
tajemnicy.
Ale chodzi Ci o tajny, losowy ciąg bitów ustalony razem z kluczami raz na zawsze?
W trybie CFB jest już stosowany wektor losowy inicjujący, więc nie wiem, czy warto to jeszcze dublować.
Nie. Po prostu losowy ciąg, np. cały pendrive 128GB. Taki sam pendrive dajesz
rozmówcy. Pierwsze 8 bajtów stanowi numer bajtu. Gdy piszesz wiadomość, to
każdy bajt wiadomości jest xorowany z bajtem z pendriva i jest zwiększana
8-bajtowa liczba na początku. Gdy osiągniesz koniec pendriva to liczbę
na początku ustawiasz na zero.

Czy można powyższy szyfr złamać przy założeniu że żadne dane z pendrivów
nie wyciekły? Moim zdaniem nie można.

Oczywiście poza tym szyfrem, szyfrujemy normalnie RSA z długim kluczem,
klucze publiczne (jak ktoś ma świra na tym punkcie) też można dać tylko
rozmówcy.

Pozdrawiam
Andrzej Lechowski
2020-02-20 21:41:42 UTC
Permalink
Ten wpis może być nieodpowiedni. Kliknij, aby go wyświetlić.
t-1
2020-04-04 17:52:35 UTC
Permalink
Post by Andrzej Lechowski
Post by osobliwy nick
Zastanawiam się nad pewnym schematem algorytmu szyfrującego. Nie spotkałem
tego rodzaju schematu w żadnych stosowanych algorytmach, co mnie trochę
dziwi, bo nie jest to trudna idea.
Nie bedzie to wywazanie otwartych drzwi?
https://www.wasko.pl/prasa-o-nas/polacy-opracowali-nowa-enigme-szyfru-tej-maszyny-nie-da-sie-zlamac-fust-pl/
https://www.rmf24.pl/fakty/polska/news-polacy-stworzyli-nowa-enigme,nId,315185
Nie jest problemem tak zaszyfrować informację aby zaszyfrowanej nie dało
się złamać.
Problemem będzie aby ją odzyskać, nawet samemu. :)

Loading...