我是对加密的新手,我正在尝试获得一个逐线加密人的工作;在应用程序运行期间,我需要能够将加密线附加到文件上,而不仅仅是一个巨大的巨大加密供电。我有一段时间的野兽。这是我的总体,在我自己的几次失败尝试之后,无耻地被偷走了:
class Encryption
{
private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
public static byte[] Encrypt(byte[] plain, string password)
{
MemoryStream memoryStream;
CryptoStream cryptoStream;
Rijndael rijndael = Rijndael.Create();
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
rijndael.Key = pdb.GetBytes(32);
rijndael.IV = pdb.GetBytes(16);
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
cryptoStream.Write(plain, 0, plain.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
return memoryStream.ToArray();
}
public static byte[] Decrypt(byte[] cipher, string password)
{
MemoryStream memoryStream;
CryptoStream cryptoStream;
Rijndael rijndael = Rijndael.Create();
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
rijndael.Key = pdb.GetBytes(32);
rijndael.IV = pdb.GetBytes(16);
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
cryptoStream.Write(cipher, 0, cipher.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
return memoryStream.ToArray();
}
}
这是一个虚拟函数,显示我如何尝试:
私有void Encryptfile(字符串filepath,字符串输出路径,字符串密码) { FileInfo FileInfo = new FileInfo(filepath); 字符串fileName = fileInfo.name; 字符串fullPath = outputpath " \" 文件名; binaryWriter writer = new BinaryWriter(file.openwrite(fullPath),encoding.ascii); ///我在这里尝试的两种方法: ///1.所需的方法:逐行加密 - 我认为我能够生成 ///多个数据块,然后将其解密。这不起作用 //string [] lines = file.readalllines(filepath); ///2.只需阅读整个内容,然后对其进行加密并一口气写。 字符串线= file.readallText(filepath); //foreach(线中的字符串线) { 字节[]字节= encoding.ascii.getBytes(line); byte []编码= engryption.encrypt(字节,密码); writer.write(编码); writer.flush(); } writer.close(); } 私有void decryptfile(字符串filepath,字符串输出路径,字符串密码) { FileInfo FileInfo = new FileInfo(filepath); 字符串fileName = fileInfo.name; 字符串fullPath = outputpath " \" 文件名; StreamWriter Writer = new StreamWriter(FullPath,false,encoding.utf8); 字节[]字节= file.readallBytes(filepath); ///这是目前正在使用解密的方法;只是 ///获取所有数据,然后一口气将其解密。 字节[]解密= engryption.decrypt(bytes,passwass); 字符串s = encoding.ascii.getString(解密); writer.write(s); writer.flush(); ///我在这里尝试了许多事情,以按线进行解密, ///什么都没有。这崩溃了有关填充的问题 ///无效。 /* int index = 0; int count = 32; while(索引
我不完全确定我应该做什么。我一直在徘徊,浏览事物并在线阅读示例,但是它们似乎都是如何加密整个文件或只是加密数据,而无能为力,只不过立即解密它。我应该如何处理逐条写作?
而不是为您编程,我会给您一个可以实现的方案。
如果您有每行加密,我认为您也希望每行解密。请注意,对于计算机来说,"线"是一个不便的术语。这只是一堆以某种线条终结者结尾的字符。字符本身是使用特定字符编码编码的。
此外,我将做以下假设:
- 应用行呈现加密文本,这意味着字节需要从二进制转换为字符(使用编码);
- 您希望使用一个键,同时保持安全;
- 您不需要密码文本的完整性保护或身份验证,只有机密性。
现在这个想法很简单:
- 使用基于密码的键推导函数创建一个键;
- 打开文本文件以读取(使用正确的字符编码);
- 读取一条线,然后将行再次转换为字节(例如,使用UTF-8);
- 创建一个输出流,该输出流在下面创建字节数组;
- 创建一个随机IV并将其写入字节数组(IV始终是单个块大小);
- 创建一个加密流并将其连接到同一输出流;
- 加密编码行;
- 基本64编码加密字节,并确保其停留在一行中;
- 将编码的,加密的行写入新的文本文件。
进行相反的操作,逆转过程,尽管应从基础64解码后从字节中检索IV,并且当然应该使用与加密过程中使用的相同方法来计算密钥。