Szyfrowanie stringa dwoma hasłami

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?

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ć?

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.

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?

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ą.

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

1

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

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.

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