C#中的字节数组加密

时间:2010-09-14 15:01:06

标签: c# cryptography

我想使用按位运算符创建一个很好的加密。 但是我没有这样做。

我希望它有按位运算符使用字节数组来加密和解密我的字节数组。

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个字符串来加密和解密所有数据。

5 个答案:

答案 0 :(得分:26)

这有时被称为“craptography”,因为它提供了安全的幻觉,同时在功能上无用于保护任何东西。如果你想正确进行加密,请使用framework classes,因为自己很难推出加密技术。

请查看此信息,了解您正在尝试做什么(加密/解密) - http://msdn.microsoft.com/en-us/library/e970bs09.aspx。确实,您的要求应确定您决定使用哪些课程。这有很好的背景:http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx

对于简单的加密/解密(如果这是你需要的)DPAPI可能是最简单的方法。

答案 1 :(得分:10)

您似乎正在尝试实施XOR cipher。 COR中的XOR是^

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

由于Encrypt和Decrypt方法完全相同,因此只需要一种方法。

但请注意,这只是一个玩具而不适合来保护现实场景中的数据。看看System.Security.Cryptography Namespace,它提供了许多经过验证的算法的实现。正确使用这些仍然难以正确

答案 2 :(得分: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]);
        }
    }
}

答案 3 :(得分: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();
    }

答案 4 :(得分:0)

请记住,没有“安全”密码这样的东西。可以打破任何可写的加密方法。 话虽如此,使用简单的按位技术进行加密是为了让一个不太明亮的黑客破坏你的加密。有些人/女孩整天坐着,没有更好的事情要做。 使用其中一个使用大密钥的加密库,并在使用之前对该密钥执行“异常”操作。即便如此,请记住,有些人受雇并且没有受雇,除了打破全世界的加密信息之外什么都不做; 24乘7。 德国人认为他们在二战中有一个不易破碎的系统。他们称之为Enigma。做一些阅读,你会发现它甚至在战争爆发前就被打破了!