using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility.Encrypt
{
public sealed class DataEncryption
{
private static byte[] KEY = new byte[8] { 40, 16, 37, 37, 32, 62, 83, 60 };
private static byte ByteXor(byte b, byte key)
{
b = (byte)(b ^ key);
return b;
}
private static byte[] ByteXor(byte[] data, byte[] key)
{
var keyLen = key.Length;
var dataLen = data.Length;
if (dataLen == 0)
{
return data;
}
for (var i = 0; i < dataLen; i++)
{
data[i] = ByteXor(data[i], key[i % keyLen]);
}
return data;
}
///
/// 加密,key必须是2的n次方
///
public static byte[] Encryption(byte[] data, byte[] key)
{
return ByteXor(data, key);
}
///
/// 加密, 使用内置密钥
///
public static byte[] Encryption(byte[] data)
{
return ByteXor(data, KEY);
}
///
/// 加密文件
///
/// 明文文件
/// 密文文件
/// 密钥
public static void Encryption(string srcFile, string descFile, byte[] key)
{
var fs = File.OpenRead(srcFile);
var newfs = File.Create(descFile, 1024 * 512);
var count = 0;
var keyLen = key.Length;
var buffer = new byte[1024 * 512];
using (fs)
{
using (newfs)
{
if (fs.Length == 0)
{
return;
}
while (fs.Position < fs.Length)
{
count = fs.Read(buffer, 0, 1024 * 512);
for (var i = 0; i < count; i++)
{
buffer[i] = ByteXor(buffer[i], key[i % keyLen]);
}
newfs.Write(buffer, 0, count);
}
}
}
}
///
/// 加密文件, 使用内置密钥
///
/// 明文文件
/// 密文文件
public static void Encryption(string srcFile, string descFile)
{
Encryption(srcFile, descFile, KEY);
}
///
/// 解密
///
public static byte[] Decryption(byte[] data, byte[] key)
{
return ByteXor(data, key);
}
///
/// 解密, 使用内置密钥
///
public static byte[] Decryption(byte[] data)
{
return ByteXor(data, KEY);
}
///
/// 解密文件
///
/// 密文文件
/// 解密后的文件
/// 密钥
public static void Decryption(string srcFile, string descFile, byte[] key)
{
Encryption(srcFile, descFile, key);
}
///
/// 解密文件, 使用内置密钥
///
/// 密文文件
/// 解密后的文件
public static void Decryption(string srcFile, string descFile)
{
Decryption(srcFile, descFile, KEY);
}
///
/// 根据文件路径判断是否加密文件
///
/// 文件路径
///
public static bool JudgeIsEncryFile(string srcFile)
{
return srcFile.LastIndexOf(".encry") > 0;
}
///
/// 解密文件,返回base64值
///
///
///
public static string Decryptiones(string srcFile)
{
var fs = File.OpenRead(srcFile);
//var newfs = File.Create(descFile, 1024 * 512);
var newfs = new MemoryStream();
var count = 0;
var keyLen = KEY.Length;
var buffer = new byte[1024 * 512];
using (fs)
{
using (newfs)
{
if (fs.Length == 0)
{
return null;
}
while (fs.Position < fs.Length)
{
count = fs.Read(buffer, 0, 1024 * 512);
for (var i = 0; i < count; i++)
{
buffer[i] = ByteXor(buffer[i], KEY[i % keyLen]);
}
newfs.Write(buffer, 0, count);
}
}
}
var base64 = Convert.ToBase64String(newfs.ToArray());
return base64;
}
}
}