2010-09-14 6 views
4

Я хочу создать красивую криптографию с помощью побитовых операторов. Однако я не могу этого сделать.Криптография массива байтов в C#

Я хочу, чтобы у него были побитовые операторы с использованием байтового массива для шифрования и расшифровки моего байтового массива.

public class Cryptographer 
{ 
    private byte[] Keys { get; set; } 

    public Cryptographer(string password) 
    { 
     Keys = Encoding.ASCII.GetBytes(password); 
    } 

    public void Encrypt(byte[] data) 
    { 
     for(int i = 0; i < data.Length; i++) 
     { 
      data[i] = (byte) (data[i] & Keys[i]); 
     } 
    } 

    public void Decrypt(byte[] data) 
    { 
     for (int i = 0; i < data.Length; i++) 
     { 
      data[i] = (byte)(Keys[i] & data[i]); 
     } 
    } 
} 

Я знаю, что это неправильно, вот почему мне нужна помощь. Я просто хочу, чтобы он использовал 1 строку для шифрования и дешифрования всех данных.

+1

Рассказывая, что удерживает вас, помогает другим людям помочь вам. – wtaniguchi

+0

Что удерживает меня, я нахожу операторов очень трудными для понимания, а также я не знаю техники, чтобы сделать эту криптографию немного более безопасной. – Basser

+3

Если вы серьезно относитесь к этому, чтобы защитить что-либо, вам не рекомендуется писать свой собственный код здесь. Если это код практики, то штраф. –

ответ

26

Это то, что иногда называют «craptography», потому что это создает иллюзию безопасности, будучи функционально бесполезны в защите ничего. Используйте framework classes, если вы хотите сделать криптографию правильно, потому что очень сложно катиться самостоятельно.

Посмотрите на это, чтобы узнать, что вы пытаетесь сделать (зашифровать/расшифровать) - http://msdn.microsoft.com/en-us/library/e970bs09.aspx. На самом деле ваши требования должны определять, какие классы вы решите использовать. Это имеет хороший фон: http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx

Для простого шифрования/дешифрования (если это то, что вам нужно) DPAPI может быть самым простым способом.

+14

+1, только для " craptography ":) – LukeH

+1

Pencgnfgvp nafjre! – bzlm

+0

Я не очень много знаю о криптографии, и я, конечно, не знаю, как их реализовать. – Basser

6

Использовать Xor ^ Оператор и нет И &. Также вы не должны предполагать, что данные и ключ имеют одинаковую длину.

public class Cryptographer 
{ 
    private byte[] Keys { get; set; } 

    public Cryptographer(string password) 
    { 
     Keys = Encoding.ASCII.GetBytes(password); 
    } 

    public void Encrypt(byte[] data) 
    { 
     for(int i = 0; i < data.Length; i++) 
     { 
      data[i] = (byte) (data[i]^Keys[i % Keys.Length]); 
     } 
    } 

    public void Decrypt(byte[] data) 
    { 
     for (int i = 0; i < data.Length; i++) 
     { 
      data[i] = (byte)(Keys[i % Keys.Length]^data[i]); 
     } 
    } 
} 
+0

Но я хочу, чтобы он был немного более продвинутым, и я действительно запутался прямо сейчас. – Basser

+0

Проверьте это, например, код использования .Net-классов для шифрования: http://www.obviex.com/samples/Code.aspx?Source=EncryptionCS&Title=Symmetric%20Key%20Encryption&Lang=C%23 –

10

Вы, кажется, пытаетесь реализовать XOR cipher. XOR в C# ^:

public void Crypt(byte[] data) 
{ 
    for(int i = 0; i < data.Length; i++) 
    { 
     data[i] = (byte) (data[i]^Keys[i]); 
    }        ↑ 
} 

Поскольку метод шифрования и дешифрования сделать то же самое, что вам нужно только один метод.

Обратите внимание, что это только игрушка и не подходит для обеспечения безопасности данных в реальных сценариях. Посмотрите на System.Security.Cryptography Namespace, который предоставляет множество реализаций проверенных алгоритмов. С их помощью по-прежнему трудно получить право.

+8

A (глупый) nitpick: шифрование XOR может быть безопасным, если * (a) * ключ, по крайней мере, до тех пор, пока сообщение, * (b) * ключ действительно случайный, и * (c) * ключ никогда повторно использовать. Вуаля! Одноразовая панель. – LukeH

0
static void Main(string[] args) 
    { 

     Int32 a = 138; 
     Console.WriteLine("first int: " + a.ToString()); 

     byte[] bytes = BitConverter.GetBytes(a); 

     var bits = new BitArray(bytes); 
     String lol = ToBitString(bits); 
     Console.WriteLine("bit int: " + lol); 

     lol = lol.Substring(1, lol.Length - 1) + lol[0]; 
     Console.WriteLine("left : " + lol); 

     byte[] bytes_new = GetBytes(lol); 

     byte[] key = { 12, 13, 24, 85 }; 
     var bits2 = new BitArray(key); 
     String lol2 = ToBitString(bits2); 
     Console.WriteLine("key : " + lol2); 

     byte[] cryptedBytes = Crypt(bytes_new, key); 
     var bits3 = new BitArray(cryptedBytes); 
     String lol3 = ToBitString(bits3); 
     Console.WriteLine(" XOR: " + lol3); 

     byte[] deCryptedBytes = Crypt(cryptedBytes, key); 
     var bits4 = new BitArray(cryptedBytes); 
     String lol4 = ToBitString(bits4); 
     Console.WriteLine(" DEXOR: " + lol4); 

     int a_new = BitConverter.ToInt32(bytes_new, 0); 
     Console.WriteLine("and int: " + a_new.ToString()); 

     Console.ReadLine(); 
    } 

    public static byte[] Crypt(byte[] data, byte[] key) 
    { 
     byte[] toCrypt = data; 
     for (int i = 0; i < toCrypt.Length; i++) 
     { 
      toCrypt[i] = (byte)(toCrypt[i]^key[i]); 
     } 
     return toCrypt; 
    } 

    private static String ToBitString(BitArray bits) 
    { 
     var sb = new StringBuilder(); 

     for (int i = bits.Count - 1; i >= 0; i--) 
     { 
      char c = bits[i] ? '1' : '0'; 
      sb.Append(c); 
     } 

     return sb.ToString(); 
    } 

    private static byte[] GetBytes(string bitString) 
    { 
     byte[] result = Enumerable.Range(0, bitString.Length/8). 
      Select(pos => Convert.ToByte(
       bitString.Substring(pos * 8, 8), 
       2) 
      ).ToArray(); 

     List<byte> mahByteArray = new List<byte>(); 
     for (int i = result.Length - 1; i >= 0; i--) 
     { 
      mahByteArray.Add(result[i]); 
     } 

     return mahByteArray.ToArray(); 
    } 
0

Помните, что шифрования не существует. Любой способ шифрования, который может быть записан, может быть нарушен. С учетом сказанного, использование простых побитовых методов для шифрования приглашает не слишком яркого хакера, чтобы прервать шифрование. Есть парни/девушки, которые сидят целый день, и ничего лучше делать. Используйте одну из библиотек шифрования, которая использует большой ключ и делает что-то необычное для этого ключа перед его использованием. Несмотря на это, помните, что есть люди, занятые и не работающие, чтобы ничего не делать, кроме разрыва криптографических сообщений по всему миру; 24 на 7. Немцы думали, что во Второй мировой войне у них была неразрывная система. Они назвали это Enigma. Прочитайте об этом, и вы обнаружите, что он был сломан еще до начала войны!

Смежные вопросы