C#中的字节数组加密

Bas*_*ser 4 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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这是错的,这就是我需要帮助的原因.我只是希望它使用1个字符串来加密和解密所有数据.

Ste*_*end 26

这有时被称为"craptography",因为它提供了安全的幻觉,同时在功能上无用于保护任何东西.如果你想正确地进行加密,请使用框架类,因为滚动自己非常困难.

看看这个是关于你想要做什么(加密/解密)的建议 - http://msdn.microsoft.com/en-us/library/e970bs09.aspx.确实,您的要求应确定您决定使用哪些课程.这有很好的背景:http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx

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

  • 虽然我同意使用一些加密框架最适合现实世界的场景,但我相信OP正在尝试学习基本的加密技术,而学习它的唯一好方法是从头开始并推出自己的简单xor代码.这就是我刚刚发现这篇文章,试图学习简单的xor用于学习目的.我永远不会为我的敏感数据写自己的. (3认同)

dtb*_*dtb 10

您似乎正在尝试实施XOR密码.XOR ^ 在C#中:

public void Crypt(byte[] data)
{
    for(int i = 0; i < data.Length; i++)
    {
        data[i] = (byte) (data[i] ^ Keys[i]);
    }                             ?
}
Run Code Online (Sandbox Code Playgroud)

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

但请注意,这只是一个玩具,并不适合在真实场景中保护数据.查看System.Security.Cryptography命名空间,它提供了许多经过验证的算法的实现.尽管如此,正确使用这些仍然很难.

  • 一个(愚蠢的)挑剔:XOR加密可以是安全的,如果*(a)*密钥至少与消息一样长,*(b)*密钥是真正随机的,而*(c)*密钥永远不会重新-用过的.瞧!一次性垫. (8认同)

Ale*_*ort 6

使用Xor ^运算符而不是And &.此外,您不应该假设数据和密钥长度相同.

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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)