Простое небезопасное двустороннее & ldquo; запутывание & rdquo; для C #

До HTML5 мы можем использовать:

parent.location.hash = "hello";

и:

window.location.replace("http:www.example.com");

Этот метод перезагрузит вашу страницу, но HTML5 представил history.pushState(page, caption, replace_url), который не должен перезагружать ваши стр.

415
задан paxdiablo 10 May 2017 в 19:47
поделиться

7 ответов

Другие ответы здесь работают нормально, но AES - более безопасный и современный алгоритм шифрования. Это класс, который я получил несколько лет назад для выполнения шифрования AES, который я со временем модифицировал, чтобы сделать его более удобным для веб-приложений (например, я создал методы шифрования / дешифрования, которые работают с дружественной к URL-адресам строкой). В нем также есть методы, работающие с байтовыми массивами.

ПРИМЕЧАНИЕ: вы должны использовать разные значения в массивах Key (32 байта) и Vector (16 байтов)! Вы бы не хотели, чтобы кто-то выяснил ваши ключи, просто предположив, что вы использовали этот код как есть! Все, что вам нужно сделать, это изменить некоторые числа (должно быть <= 255) в массивах Key и Vector (я оставил одно недопустимое значение в массиве Vector, чтобы убедиться, что вы это делаете ...). Вы можете использовать https://www.random.org/bytes/ , чтобы легко сгенерировать новый набор:

Использование просто: просто создайте экземпляр класса, а затем вызовите (обычно) EncryptToString (строка StringToEncrypt) и DecryptString (строка StringToDecrypt) как методы. Нет ничего проще (или безопаснее), если у вас есть этот класс.


using System;
using System.Data;
using System.Security.Cryptography;
using System.IO;


public class SimpleAES
{
    // Change these keys
    private byte[] Key = __Replace_Me__({ 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 });

    // a hardcoded IV should not be used for production AES-CBC code
    // IVs should be unpredictable per ciphertext
    private byte[] Vector = __Replace_Me__({ 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 2521, 112, 79, 32, 114, 156 });


    private ICryptoTransform EncryptorTransform, DecryptorTransform;
    private System.Text.UTF8Encoding UTFEncoder;

    public SimpleAES()
    {
        //This is our encryption method
        RijndaelManaged rm = new RijndaelManaged();

        //Create an encryptor and a decryptor using our encryption method, key, and vector.
        EncryptorTransform = rm.CreateEncryptor(this.Key, this.Vector);
        DecryptorTransform = rm.CreateDecryptor(this.Key, this.Vector);

        //Used to translate bytes to text and vice versa
        UTFEncoder = new System.Text.UTF8Encoding();
    }

    /// -------------- Two Utility Methods (not used but may be useful) -----------
    /// Generates an encryption key.
    static public byte[] GenerateEncryptionKey()
    {
        //Generate a Key.
        RijndaelManaged rm = new RijndaelManaged();
        rm.GenerateKey();
        return rm.Key;
    }

    /// Generates a unique encryption vector
    static public byte[] GenerateEncryptionVector()
    {
        //Generate a Vector
        RijndaelManaged rm = new RijndaelManaged();
        rm.GenerateIV();
        return rm.IV;
    }


    /// ----------- The commonly used methods ------------------------------    
    /// Encrypt some text and return a string suitable for passing in a URL.
    public string EncryptToString(string TextValue)
    {
        return ByteArrToString(Encrypt(TextValue));
    }

    /// Encrypt some text and return an encrypted byte array.
    public byte[] Encrypt(string TextValue)
    {
        //Translates our text value into a byte array.
        Byte[] bytes = UTFEncoder.GetBytes(TextValue);

        //Used to stream the data in and out of the CryptoStream.
        MemoryStream memoryStream = new MemoryStream();

        /*
         * We will have to write the unencrypted bytes to the stream,
         * then read the encrypted result back from the stream.
         */
        #region Write the decrypted value to the encryption stream
        CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
        cs.Write(bytes, 0, bytes.Length);
        cs.FlushFinalBlock();
        #endregion

        #region Read encrypted value back out of the stream
        memoryStream.Position = 0;
        byte[] encrypted = new byte[memoryStream.Length];
        memoryStream.Read(encrypted, 0, encrypted.Length);
        #endregion

        //Clean up.
        cs.Close();
        memoryStream.Close();

        return encrypted;
    }

    /// The other side: Decryption methods
    public string DecryptString(string EncryptedString)
    {
        return Decrypt(StrToByteArray(EncryptedString));
    }

    /// Decryption when working with byte arrays.    
    public string Decrypt(byte[] EncryptedValue)
    {
        #region Write the encrypted value to the decryption stream
        MemoryStream encryptedStream = new MemoryStream();
        CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
        decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
        decryptStream.FlushFinalBlock();
        #endregion

        #region Read the decrypted value from the stream.
        encryptedStream.Position = 0;
        Byte[] decryptedBytes = new Byte[encryptedStream.Length];
        encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
        encryptedStream.Close();
        #endregion
        return UTFEncoder.GetString(decryptedBytes);
    }

    /// Convert a string to a byte array.  NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so).
    //      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    //      return encoding.GetBytes(str);
    // However, this results in character values that cannot be passed in a URL.  So, instead, I just
    // lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100).
    public byte[] StrToByteArray(string str)
    {
        if (str.Length == 0)
            throw new Exception("Invalid string value in StrToByteArray");

        byte val;
        byte[] byteArr = new byte[str.Length / 3];
        int i = 0;
        int j = 0;
        do
        {
            val = byte.Parse(str.Substring(i, 3));
            byteArr[j++] = val;
            i += 3;
        }
        while (i < str.Length);
        return byteArr;
    }

    // Same comment as above.  Normally the conversion would use an ASCII encoding in the other direction:
    //      System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    //      return enc.GetString(byteArr);    
    public string ByteArrToString(byte[] byteArr)
    {
        byte val;
        string tempStr = "";
        for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
        {
            val = byteArr[i];
            if (val < (byte)10)
                tempStr += "00" + val.ToString();
            else if (val < (byte)100)
                tempStr += "0" + val.ToString();
            else
                tempStr += val.ToString();
        }
        return tempStr;
    }
}
468
ответ дан jbtule 10 May 2017 в 19:47
поделиться

Я знаю, что Вы сказали, что не заботитесь о том, насколько безопасный это, но если бы Вы выбрали DES, то Вы могли бы также взять AES, это - более актуальный метод шифрования.

0
ответ дан Peter Mortensen 10 May 2017 в 19:47
поделиться

Пространство имен System.Security.Cryptography содержит TripleDESCryptoServiceProvider и RijndaelManaged, классы

не забывают добавлять ссылку на System.Security блок.

1
ответ дан Mitch Wheat 10 May 2017 в 19:47
поделиться

Если Вы просто хотите простое шифрование (т.е. возможный для решительного взломщика повредиться, но блокирующий наиболее обычных пользователей), просто выберите два пароля равной длины, скажите:

deoxyribonucleicacid
while (x>0) { x-- };

и xor Ваши данные с ними обоими (цикличное выполнение пароли при необходимости) <глоток> (a) . Например:

1111-2222-3333-4444-5555-6666-7777
deoxyribonucleicaciddeoxyribonucle
while (x>0) { x-- };while (x>0) { 

Кто-то ищущий Ваш двоичный файл может думать, что строка DNA является ключом, но они вряд ли будут думать, что код C - что-либо кроме неинициализированной памяти, сохраненной с Вашим двоичным файлом.

<час>

<глоток> (a) Имеют в виду, что это очень простое шифрование и, по некоторым определениям, не может считаться шифрованием вообще (так как намерение шифрования к , предотвращают несанкционированный доступ, а не просто делают его более трудным). Хотя, конечно, даже самое сильное шифрование небезопасно когда чье-то положение по креплениям для ключей со стальным каналом.

, Как указано в первом предложении, это - средство мешать достаточно случайному взломщику, которого они углубят. Это подобно предотвращению краж на Вашем доме - Вы не должны делать его неприступным, просто необходимо сделать его менее уязвимым, чем дом ближайший:-)

6
ответ дан paxdiablo 10 May 2017 в 19:47
поделиться

Да, добавьте System.Security блок, импортируйте System.Security.Cryptography пространство имен. Вот простой пример симметричного (DES) шифрование алгоритма:

DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.GenerateKey();
byte[] key = des.Key; // save this!

ICryptoTransform encryptor = des.CreateEncryptor();
// encrypt
byte[] enc = encryptor.TransformFinalBlock(new byte[] { 1, 2, 3, 4 }, 0, 4);

ICryptoTransform decryptor = des.CreateDecryptor();

// decrypt
byte[] originalAgain = decryptor.TransformFinalBlock(enc, 0, enc.Length);
Debug.Assert(originalAgain[0] == 1);
36
ответ дан Soner Gönül 10 May 2017 в 19:47
поделиться

Шифрование легко: как другие указали, в Системе существуют классы. Безопасность. Пространство имен криптографии, которые делают всю работу для Вас. Используйте их, а не любое решение собственной разработки.

, Но дешифрование легко также. Проблемой, которую Вы имеете, не является алгоритм шифрования, но доступ защиты к ключу, используемому для дешифрования.

я использовал бы одно из следующих решений:

  • DPAPI использование класса ProtectedData с объемом CurrentUser. Это легко, поскольку Вы не должны волноваться о ключе. Данные могут только быть дешифрованы тем же пользователем, таким образом отрицательный результат для обмена данными между пользователями или машинами.

  • DPAPI использование класса ProtectedData с объемом LocalMachine. Хороший для, например, защищающий данные конфигурации на единственном защищенном сервере. Но любой, кто может войти в машину, может зашифровать ее, таким образом отрицательный результат, если сервер не безопасен.

  • Любой симметричный алгоритм. Я обычно использую статический SymmetricAlgorithm. Создайте () метод, если я не забочусь о том, какой алгоритм используется (на самом деле, это - Rijndael по умолчанию). В этом случае необходимо защитить ключ так или иначе. Например, можно запутать его в некотором роде и скрыть его в коде. Но знайте, что любой, кто достаточно умен для декомпиляции кода, вероятно, будет в состоянии найти ключ.

5
ответ дан Joe 10 May 2017 в 19:47
поделиться

[РЕДАКТИРОВАНИЕ] несколько лет спустя, я возвратился для высказывания: не делают этого! См. What' s неправильно с шифрованием XOR? для деталей.

А очень простой, легкий двухсторонний encrytpion является шифрованием XOR.

  1. Придумывает пароль. Давайте иметь его быть mypass.
  2. Преобразовывают пароль в двоичный файл (согласно ASCII). Пароль становится 01101101 01111001 01110000 01100001 01110011 01110011.
  3. Берут сообщение, которое Вы хотите закодировать. Преобразуйте это в двоичный файл, также.
  4. Взгляд на длину сообщения. Если длина сообщения составляет 400 байтов, превратите пароль в 400 строк байтов путем повторения его много раз. Это стало бы 01101101 01111001 01110000 01100001 01110011 01110011 01101101 01111001 01110000 01100001 01110011 01110011 01101101 01111001 01110000 01100001 01110011 01110011... (или mypassmypassmypass...)
  5. XOR сообщение с длинным паролем.
  6. Отправляют результат.
  7. Другое время, XOR зашифрованное сообщение с тем же паролем (mypassmypassmypass...).
  8. Там является Вашим сообщением!
8
ответ дан Community 10 May 2017 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: