Szukam bardzo prostego zaciemnienia (takiego jak szyfrowanie i deszyfrowanie, ale niekoniecznie bezpieczne) dla niektórych danych. To nie jest krytyczne zadanie. Potrzebuję czegoś, aby uczciwi ludzie byli uczciwi, ale coś nieco silniejszego niż ROT13 lub Base64 .
Wolałbym coś, co jest już zawarte w .NET Framework 2.0, więc nie muszę się martwić o zewnętrzne zależności.
Naprawdę nie chcę się bawić z kluczami publicznymi / prywatnymi itp. Nie wiem dużo o szyfrowaniu, ale wiem wystarczająco dużo, aby wiedzieć, że wszystko, co napisałem, byłoby mniej niż bezwartościowe ... Prawdopodobnie spieprzyłbym matematykę i uczyniłbym ją trywialną.
c#
obfuscation
Matt Dawdy
źródło
źródło
Odpowiedzi:
Inne odpowiedzi tutaj działają dobrze, ale AES to bardziej bezpieczny i aktualny algorytm szyfrowania. Jest to klasa, którą uzyskałem kilka lat temu, aby wykonać szyfrowanie AES, które z czasem zmodyfikowałem, aby były bardziej przyjazne dla aplikacji internetowych (np. Zbudowałem metody szyfrowania / deszyfrowania, które działają z ciągiem przyjaznym adresowi URL). Ma również metody, które działają z tablicami bajtów.
UWAGA: należy użyć różnych wartości w tablicach Key (32 bajty) i Vector (16 bajtów)! Nie chciałbyś, aby ktoś odkrył twoje klucze, zakładając, że użyłeś tego kodu w obecnej postaci! Wszystko, co musisz zrobić, to zmienić niektóre liczby (muszą być <= 255) w tablicach Key i Vector (zostawiłem jedną niepoprawną wartość w tablicy Vector, aby mieć pewność, że to zrobisz ...). Możesz użyć https://www.random.org/bytes/, aby łatwo wygenerować nowy zestaw:
Key
Vector
Korzystanie z niego jest proste: wystarczy utworzyć instancję klasy, a następnie wywołać (zwykle) EncryptToString (ciąg StringToEncrypt) i DecryptString (ciąg StringToDecrypt) jako metody. Po tym, jak ta klasa będzie na miejscu, nie może być łatwiej (ani bezpieczniej).
źródło
Wyczyściłem SimpleAES (powyżej) na własny użytek. Naprawiono skomplikowane metody szyfrowania / deszyfrowania; oddzielne metody kodowania buforów bajtów, ciągów i ciągów przyjaznych adresom URL; wykorzystał istniejące biblioteki do kodowania adresów URL.
Kod jest mały, prostszy, szybszy, a wynik jest bardziej zwięzły. Na przykład
[email protected]
produkuje:Kod:
źródło
Tak, dodaj
System.Security
zestaw, zaimportujSystem.Security.Cryptography
przestrzeń nazw. Oto prosty przykład szyfrowania algorytmem symetrycznym (DES):źródło
Pomyślałem, że dodam, że ulepszyłem Mud's SimplerAES, dodając losowy IV, który jest przekazywany z powrotem do zaszyfrowanego ciągu. Poprawia to szyfrowanie, ponieważ szyfrowanie tego samego ciągu spowoduje za każdym razem inne wyjście.
I test jednostkowy premii
źródło
System.Random
jako RNG. 2) Jest to całkowicie złamane przeciwko atakom na wybranyWariant Znaków (doskonała) odpowiedź
Mam nadzieję że to pomoże
źródło
[EDYCJA] Wiele lat później wróciłem i powiedziałem: nie rób tego! Zobacz Co jest nie tak z szyfrowaniem XOR?dla szczegółów.
Bardzo prostym, łatwym dwukierunkowym szyfrowaniem jest szyfrowanie XOR.
mypass
.mypassmypassmypass...
)mypassmypassmypass...
).źródło
Połączyłem to, co uważałem za najlepsze, z kilku odpowiedzi i komentarzy.
Kod:
Aktualizacja 2015-07-18: Naprawiono błąd w prywatnej metodzie Encrypt () w komentarzach @bpsilver i @Evereq. IV został przypadkowo zaszyfrowany, jest teraz poprzedzony czystym tekstem, zgodnie z oczekiwaniami Decrypt ().
źródło
return _encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); return _rijndael.IV.Concat(inputBuffer).ToArray();
Jeśli chcesz po prostu prostego szyfrowania (tj. Możliwego do złamania określonego crackera, ale blokowania większości zwykłych użytkowników), po prostu wybierz dwa hasła o równej długości, powiedz:
i prześlij swoje dane za pomocą obu z nich (w razie potrzeby zapętlając hasła) (a) . Na przykład:
Ktoś, kto przeszukuje twój plik binarny, może pomyśleć, że łańcuch DNA jest kluczem, ale raczej nie przypuszcza, że kod C to coś innego niż niezainicjowana pamięć zapisana z twoim plikiem binarnym.
(a) Należy pamiętać, że jest to bardzo proste szyfrowanie i, zgodnie z niektórymi definicjami, może wcale nie być traktowane jako szyfrowanie (ponieważ celem szyfrowania jest zapobieganie raczej nieautoryzowanemu dostępowi, niż tylko utrudnienie). Chociaż oczywiście nawet najsilniejsze szyfrowanie jest niepewne, gdy ktoś stoi nad uchwytami na klucze za pomocą stalowej rury.
Jak stwierdzono w pierwszym zdaniu, jest to sposób na utrudnienie przypadkowemu napastnikowi, aby ruszył dalej. Przypomina to zapobieganie włamaniom w twoim domu - nie musisz sprawiać, by był nie do zdobycia, musisz tylko uczynić go mniejszym niż dom obok :-)
źródło
Szyfrowanie jest łatwe: jak zauważyli inni, w przestrzeni nazw System.Security.Cryptography istnieją klasy, które wykonują całą pracę za Ciebie. Używaj ich zamiast domowych rozwiązań.
Ale odszyfrowanie jest również łatwe. Problemem nie jest algorytm szyfrowania, ale ochrona dostępu do klucza używanego do odszyfrowywania.
Użyłbym jednego z następujących rozwiązań:
DPAPI przy użyciu klasy ProtectedData z zakresem CurrentUser. Jest to łatwe, ponieważ nie musisz martwić się o klucz. Dane mogą być odszyfrowane tylko przez tego samego użytkownika, więc nie nadaje się do udostępniania danych między użytkownikami lub komputerami.
DPAPI przy użyciu klasy ProtectedData z zakresem LocalMachine. Dobry np. Do ochrony danych konfiguracyjnych na jednym bezpiecznym serwerze. Ale każdy, kto może zalogować się do komputera, może go zaszyfrować, więc nic dobrego, chyba że serwer jest bezpieczny.
Dowolny algorytm symetryczny. Zazwyczaj używam statycznej metody SymmetricAl Algorytm.Create (), jeśli nie dbam o to, który algorytm jest używany (w rzeczywistości jest to domyślnie Rijndael). W takim przypadku musisz jakoś zabezpieczyć swój klucz. Np. Możesz go w jakiś sposób zaciemnić i ukryć w swoim kodzie. Pamiętaj jednak, że każdy, kto jest wystarczająco inteligentny, aby zdekompilować kod, prawdopodobnie będzie w stanie znaleźć klucz.
źródło
Chciałem opublikować swoje rozwiązanie, ponieważ żadne z powyższych rozwiązań nie jest tak proste jak moje. Powiedz mi co myślisz:
Opcjonalny
Zakłada się, że klucz maszynowy serwera używanego do szyfrowania wartości jest taki sam, jak używany do odszyfrowywania wartości. W razie potrzeby możesz określić statyczny klucz maszynowy w pliku Web.config, aby aplikacja mogła odszyfrować / zaszyfrować dane bez względu na to, gdzie są uruchomione (np. Serwer programistyczny czy produkcyjny). Możesz wygenerować statyczny klucz maszynowy postępując zgodnie z tymi instrukcjami .
źródło
Przestrzeń nazw
System.Security.Cryptography
zawiera klasyTripleDESCryptoServiceProvider
iRijndaelManaged
Nie zapomnij dodać odniesienia do
System.Security
zestawu.źródło
Korzystanie z TripleDESCryptoServiceProvider w System.Security.Cryptography :
źródło
Zmieniłem to :
do tego:
źródło
Korzystając z wbudowanej biblioteki kryptograficznej .Net, ten przykład pokazuje, jak korzystać z Advanced Encryption Standard (AES).
źródło
Wiem, że powiedziałeś, że nie obchodzi Cię, jak bezpieczne jest, ale jeśli wybierzesz DES , równie dobrze możesz wziąć AES , jest to bardziej aktualna metoda szyfrowania.
źródło
Korzystam z akceptowanej odpowiedzi Marka Brittinghama, która bardzo mi pomogła. Ostatnio musiałem wysłać zaszyfrowany tekst do innej organizacji i właśnie tam pojawiły się pewne problemy. OP nie wymaga tych opcji, ale ponieważ jest to popularne pytanie, zamieszczam swoją modyfikację (
Encrypt
iDecrypt
funkcje zapożyczone stąd ):RijndaelManaged
wartości domyślnych i jeden, w którym można określić wartości właściwości (na podstawie wzajemnego porozumienia między stronami szyfrującymi i deszyfrującymi)Oto klasa (próbka testowa na końcu):
i..
Oto próbka testowa:
źródło
Myślę, że to najprostszy na świecie!
Test
źródło