Szyfrowanie stringa dwoma hasłami

Szyfrowanie stringa dwoma hasłami
DamianOS.MP5
DamianOS.MP5
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:74
0

Mam string, w którym zapisane są loginy i hasła do skrzynek pocztowych oraz dodatkowe informacje, tj. imię osoby, która założyła konto, data założenia, cel założenia, itd.

Znalazłem kod, który szyfruje mi te dane po podaniu hasła i deszyfruje, jeśli podam właściwe hasło: http://stackoverflow.com/questions/10168240/encrypting-decrypting-a-string-in-c-sharp/10168287.

Mój problem polega na tym, że chcę, aby te dane zaszyfrowane były na dwa hasła (jedno "publiczne", drugie "prywatne"), tzn.:

  1. podaję w programie zaszyfrowany ciąg znaków i jedno z haseł; program sprawdza czy hasło się zgadza, odszyfrowuje dane i loguje się na wybraną skrzynkę pocztową; sam użytkownik, który z niego korzysta nie ma bezpośredniego dostępu do loginu i hasła, do pozostałych dodatkowych informacji ma wgląd
  2. w innym miejscu podaję ten sam zaszyfrowany ciąg znaków i drugie z haseł; program sprawdza czy hasło się zgadza, odszyfrowuje dane i mam możliwość edycji tego stringa - mam dostęp do wszystkiego (takie hasło admina).

Jak zrobić (czy da się przerobić kod z linka), żeby ten sam zaszyfrowany ciąg znaków był dostępny po podaniu dwóch różnych haseł i wpisanie hasła pierwszego w miejsce drugiego nie umożliwiło zdekodowania zaszyfrowanej treści i odwrotnie?

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0
DamianOS.MP5 napisał(a)

Jak zrobić (czy da się przerobić kod z linka), żeby ten sam zaszyfrowany ciąg znaków był dostępny po podaniu dwóch różnych haseł i wpisanie hasła pierwszego w miejsce drugiego nie umożliwiło zdekodowania zaszyfrowanej treści i odwrotnie?

Zwyczajnie zaszyfrować go drugi raz z innym hasłem i w różnych miejscach korzystać z różnych szyfrogramów :) Albo zaszyfrować kaskadowo podając kilka haseł po kolei ale to nie do końca to co chcesz osiągnąć.

W ogóle to nie lepiej zrobić po prostu system uprawnień dla danego konta aniżeli coś takiego jak Ty chcesz zaimplementować?

edytowany 3x, ostatnio: grzesiek51114
DamianOS.MP5
DamianOS.MP5
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:74
0

dzięki za odp. ale właśnie koniecznie musi to być jeden i ten sam zaszyfrowany tekst i dostępny na dwa różne hasła... system uprawnień dla danego konta się w tym wypadku niestety nie sprawdzi.

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Hmm nie da się zaszyfrować danych używając dwóch różnych haseł tak, żeby powstał ten sam szyfrogram, którego można deszyfrować którymkolwiek z tych haseł. To by była przecież poważna dziura w algorytmie! Jesteś pewien, że właśnie o coś takiego chodzi, bo w sumie nie dziwię się, że nie możesz znaleźć na ten temat informacji w Internecie?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
1

Próbujesz zrobić coś dziwnego. Skoro muszą być dwa różne hasła, to po co ma być ten sam szyfrogram?
A skoro musi być ten sam szyfrogram, to jaki sens jest używać dwóch haseł?

Ale na upartego można to zrobić. Zaszyfruj tekst dwa razy - raz jednym hasłem, a raz drugim.
Połącz oba szyfrogramy. Pierwszy użytkownik odszyfruje jedną część, a drugi drugą.

grzesiek51114
grzesiek51114
tak też można tylko pytanie właśnie nasuwa się: jak sens?
Azarien
@grzesiek51114 1: takiej metody używa zdaje się kodowanie filmów na Blu-rayach. sam film jest oczywiście w jednej kopii, ale jest zaszyfrowany kluczem pośrednim, który jest wielokrotnie umieszczony na płycie zaszyfrowany za każdym razem innym kluczem. (tak bardzo w skrócie). w ten sposób istnieje wiele kluczy pozwalających odtworzyć dany film. sens był taki że w razie wycieku któregoś klucza, nowe filmy będą wydawane bez niego.
DamianOS.MP5
DamianOS.MP5
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:74
0

w sumie z tymi dwoma hasłami masz rację, ale na pewno w jakiś sposób można otrzymać dostęp do tego samego zaszyfrowanego tekstu na dwa hasła. już podaję przykład:

w programie np. mailshare po wysłaniu pliku generuje się tzw. hashcode, który zawiera dane o których napisałem powyżej (loginy, itd.). każdy "publiczny" użytkownik, który ma dostęp do hashcode i hasła pobierania może go (plik) sobie pobrać nie mając przy tym bezpośredniego dostępu do loginów i haseł do kont pocztowych. użytkownik, który ma ten sam hashcode i drugie hasło edycji ma już dostęp do wszystkich danych, które może edytować (właściciel)

coś podobnego chcę zrobić u siebie

edytowany 4x, ostatnio: DamianOS.MP5
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Jedyne co mi przychodzi do głowy to deszyfrowanie odpowiedniego szyfrogramu w zależności od wybranego poziomu dostępu:

Kopiuj
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;

enum AccessLevel
{
    Deep,
    Deeper
}

class SecureData
{
    public byte[] DeepSecret { get; set; }
    public byte[] DeeperSecret { get; set; }
}

interface IHardened
{
    string GetPlainData(AccessLevel accessLevel, string password);
}

class Hardened : IHardened
{
    private SecureData secureData;

    public Hardened()
    {
        this.secureData = new SecureData();

        //  Test data encryption...
        this.secureData.DeepSecret = this.Encrypt(ASCIIEncoding.ASCII.GetBytes("My deep secret"), "deepPassword");
        this.secureData.DeeperSecret = this.Encrypt(ASCIIEncoding.ASCII.GetBytes("My deeper secret"), "deeperPassword");
    }

    private byte[] Encrypt(byte[] data, string password, bool encryption = true)
    {
        using (var pass = new PasswordDeriveBytes(password, null))
        {
            using (var stream = new MemoryStream())
            {
                using (var aes = new AesCryptoServiceProvider())
                {
                    aes.Key = pass.GetBytes(aes.KeySize / 8);
                    aes.IV = pass.GetBytes(aes.BlockSize / 8);

                    var process = (encryption) ? aes.CreateEncryptor() : aes.CreateDecryptor();
                    using (var crypto = new CryptoStream(stream, process, CryptoStreamMode.Write))
                    {
                        crypto.Write(data, 0, data.Length);
                    }
                    return stream.ToArray();
                }
            }
        }
    }

    private byte[] Decrypt(byte[] encrypted, string password)
    {
        return this.Encrypt(encrypted, password, false);
    }

    public string GetPlainData(AccessLevel accessLevel, string password)
    {
        return ASCIIEncoding.ASCII.GetString(this.Decrypt((accessLevel == AccessLevel.Deep) ? this.secureData.DeepSecret : this.secureData.DeeperSecret, password));
    }
}

class Program
{
    public static void Main(string[] args)
    {
        try
        {
            IHardened hardened = new Hardened();
            Console.WriteLine("My deep plain text is: {0}\nAnd my deeper plain is: {1}",
                hardened.GetPlainData(AccessLevel.Deep, "deepPassword"),
                hardened.GetPlainData(AccessLevel.Deeper, "deeperPassword"));
        }
        catch (Exception ex)
        {
            Console.WriteLine("Ups: {0}", ex.ToString());
        }
    }
}

Aczkolwiek to taka trochę kwadratura koła.

edytowany 4x, ostatnio: grzesiek51114
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)