Как зашифровать и расшифровать строку в C # - PullRequest
3 голосов
/ 20 января 2011

Я хочу зашифровать и расшифровать строку в C #, используя алгоритм, который приводит меня к той же зашифрованной строке. Например, если я зашифрую строку 122ujhdheiwe и получим uoi8asdf8asdf и снова, если я зашифрую ту же строку 122ujhdheiwe , это приведет меня к uoi8asdf8asdf строка Какие возможные алгоритмы шифрования я могу использовать и как?

Ответы [ 5 ]

1 голос
/ 06 июля 2015

enter image description here

Я пишу демонстрационную программу, нужен ли источник?Я использую это пространство имен using System.Security.Cryptography;

И два это

        public string encryptus(string x, string encrypt)//function
    {
        try
        {

            string y = x;
            byte[] etext = UTF8Encoding.UTF8.GetBytes(y);
            string Code = encrypt;
            MD5CryptoServiceProvider mdhash = new MD5CryptoServiceProvider();
            byte[] keyarray = mdhash.ComputeHash(UTF8Encoding.UTF8.GetBytes(Code));
            TripleDESCryptoServiceProvider tds = new TripleDESCryptoServiceProvider();
            tds.Key = keyarray;
            tds.Mode = CipherMode.ECB;
            tds.Padding = PaddingMode.PKCS7;

            ICryptoTransform itransform = tds.CreateEncryptor();
            byte[] result = itransform.TransformFinalBlock(etext, 0, etext.Length);
            string encryptresult = Convert.ToBase64String(result);
            return encryptresult.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
        public string dencryptus(string x, string keyai)
    {
        try
        {
            string y = x.Replace("\0", null);
            byte[] etext = Convert.FromBase64String(y);
            string key = keyai;
            MD5CryptoServiceProvider mdhash = new MD5CryptoServiceProvider();
            byte[] keyarray = mdhash.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            TripleDESCryptoServiceProvider tds = new TripleDESCryptoServiceProvider();
            tds.Key = keyarray;
            tds.Mode = CipherMode.ECB;
            tds.Padding = PaddingMode.PKCS7;

            ICryptoTransform itransform = tds.CreateDecryptor();
            byte[] result = itransform.TransformFinalBlock(etext, 0, etext.Length);
            string dencryptresult = UTF8Encoding.UTF8.GetString(result);
            return dencryptresult.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

И использую их так:

Encrypted.Text = encryptus(Message.Text, EncryptCode.Text.ToString());
Decrypted.Text = dencryptus(Message.Text, EncryptCode.Text.ToString());
1 голос
/ 21 января 2011

Вы можете использовать класс ProtectedData, если хотите простое решение:

using System;
using System.Security.Cryptography;
using System.Text;

private void example()
{
    string data = "122ujhdheiwe";

    // Encrypt
    UnicodeEncoding unicodeEncoding = new UnicodeEncoding();
    byte[] secret = ProtectedData.Protect(unicodeEncoding.GetBytes(data), null, DataProtectionScope.CurrentUser);
    Console.WriteLine(BitConverter.ToString(secret));

    // If you need it as a printable string, you can convert the binary to Base64
    string base64 = Convert.ToBase64String(secret);
    Console.WriteLine(base64);

    // Back to binary...
    byte[] backagain = Convert.FromBase64String(base64);

    // Decrypt
    byte[] clearbytes = ProtectedData.Unprotect(backagain, null, DataProtectionScope.CurrentUser);
    string roundtripped = unicodeEncoding.GetString(clearbytes);
    Console.WriteLine(roundtripped);
}

ср. ProtectedDataClass

Если вы хотите, чтобы зашифрованные данные выглядели почти так же, как ваши исходные данные, как в примере в вашем вопросе (122ujhdheiwe ==> uoi8asdf8asdf), то вы ищетесохраняющее формат шифрование - ср.здесь , для которого у меня нет примера.

РЕДАКТИРОВАТЬ: я просто заметил, что в своем вопросе вы пишете, что вы хотите иметь возможность снова зашифровать ту же строку и получить тот же зашифрованный результат, в этом случае ProtectedData не будет работать, потому что ключ, используемый в шифровании, со временем изменится.

1 голос
/ 20 января 2011

У меня есть простое решение:

http://remy.supertext.ch/2011/01/simple-c-encryption-and-decryption/

В основном это работает так:

DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] Key = { 12, 13, 14, 15, 16, 17, 18, 19 };
byte[] IV =  { 12, 13, 14, 15, 16, 17, 18, 19 };

ICryptoTransform encryptor = des.CreateEncryptor(Key, IV);

byte[] IDToBytes = ASCIIEncoding.ASCII.GetBytes(source);
byte[] encryptedID = encryptor.TransformFinalBlock(IDToBytes, 0, IDToBytes.Length);
return Convert.ToBase64String(encryptedID);

А потом наоборот.

1 голос
/ 20 января 2011

rot13 (Цезарь) может быть?Он сдвигает все символы на смещение 13. Таким образом, применив его дважды, вы снова получите простой текст.

0 голосов
/ 20 января 2011

Этот ответ содержит мой готовый к использованию Crypto Class Triple Des

.NET: какие есть варианты расшифровки пароля в файле проекта .setting

Просто создайте новую библиотеку классов, скопируйте / вставьте этот код и используйте его:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...