[英]Byte array cryptography in 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个字符串来加密和解密所有数据。
这有时被称为“craptography”,因为它提供了安全的幻觉,同时在功能上无用于保护任何东西。 如果你想正确地进行加密,请使用框架类 ,因为滚动自己非常困难。
看看这个是关于你想要做什么(加密/解密)的建议 - http://msdn.microsoft.com/en-us/library/e970bs09.aspx 。 确实,您的要求应确定您决定使用哪些课程。 这有很好的背景: http : //msdn.microsoft.com/en-us/library/92f9ye3s.aspx
对于简单的加密/解密(如果这是你需要的), DPAPI可能是最简单的方法。
您似乎正在尝试实施XOR密码 。 XOR在C#中是^
:
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命名空间 ,它提供了许多经过验证的算法的实现。 尽管如此,正确使用这些仍然很难 。
使用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]);
}
}
}
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();
}
请记住,没有“安全”密码这样的东西。 可以打破任何可写的加密方法。 话虽如此,使用简单的按位技术进行加密是为了让一个不太明亮的黑客破坏你的加密。 有些人/女孩整天坐着,没有更好的事情要做。 使用其中一个使用大密钥的加密库,并在使用之前对该密钥执行“异常”操作。 即便如此,请记住,有些人受雇并且没有受雇,除了打破全世界的加密信息之外什么都不做; 德国人认为他们在第二次世界大战中有一个不易破碎的系统。 他们称之为Enigma。 做一些阅读,你会发现它甚至在战争爆发前就被打破了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.