for Push.
This commit is contained in:
@@ -0,0 +1,271 @@
|
||||
using KssSmaPlaLib.Commons;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace KssSmaPlaLib.Encryption
|
||||
{
|
||||
public static class FIleEncryptUxer
|
||||
{
|
||||
public static bool TuckIntoMain(string[] args)
|
||||
{
|
||||
if (args.Length < 2) return false;
|
||||
|
||||
if (args[0].ToLower() == "/encfile")
|
||||
{
|
||||
var srcPath = args[1];
|
||||
var descPath = args.Length >= 3 ? args[2] : args[1] + ".enc";
|
||||
var password= args.Length >= 4 ? args[3] : string.Empty;
|
||||
if (TryEncrypt(srcPath, descPath, out var messageForMe, password))
|
||||
{
|
||||
LoggerUxer.Info($"ファイル暗号化が成功しました。");
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerUxer.Error($"ファイル暗号化が失敗しました。[エラー内容:{messageForMe}]");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (args[0].ToLower() == "/decfile")
|
||||
{
|
||||
var srcPath = args[1];
|
||||
var descPath = args.Length >= 3 ? args[2] : (srcPath.EndsWith(".enc") ? srcPath.TrimEnd(".enc".ToArray()) : srcPath + ".src");
|
||||
var password = args.Length >= 4 ? args[3] : string.Empty;
|
||||
if (TryDecrypt(srcPath, descPath, out var messageForMe, password))
|
||||
{
|
||||
Console.WriteLine($"ファイル複合化が成功しました。");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"ファイル複合化が失敗しました。[エラー内容:{messageForMe}]");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (args[0].ToLower() == "/encbigfile")
|
||||
{
|
||||
var srcPath = args[1];
|
||||
var descPath = args.Length >= 3 ? args[2] : args[1] + ".enc";
|
||||
var password = args.Length >= 4 ? args[3] : string.Empty;
|
||||
// テキストのみ方式
|
||||
if (TryEncryptLargeFileToBase64(srcPath, descPath, out var messageForMe, true, password))
|
||||
{
|
||||
LoggerUxer.Info($"ファイル暗号化が成功しました。");
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerUxer.Error($"ファイル暗号化が失敗しました。[エラー内容:{messageForMe}]");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (args[0].ToLower() == "/decbigfile")
|
||||
{
|
||||
var srcPath = args[1];
|
||||
var descPath = args.Length >= 3 ? args[2] : (srcPath.EndsWith(".enc") ? srcPath.TrimEnd(".enc".ToArray()) : srcPath + ".src");
|
||||
var password = args.Length >= 4 ? args[3] : string.Empty;
|
||||
if (TryDecryptLargeFileFromBase64(srcPath, descPath, out var messageForMe, true, password))
|
||||
{
|
||||
Console.WriteLine($"ファイル複合化が成功しました。");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"ファイル複合化が失敗しました。[エラー内容:{messageForMe}]");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool TryEncryptLargeFileToBase64(string inputFilePath, string outputTextFilePath, out string resultMessage, bool isAllText = false, string password = "")
|
||||
{
|
||||
if (string.IsNullOrEmpty(password)) password = SimpleEncryptUxer.FixedPassword;
|
||||
|
||||
try
|
||||
{
|
||||
byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
|
||||
using (var aes = Aes.Create())
|
||||
{
|
||||
aes.Key = key;
|
||||
aes.GenerateIV();
|
||||
|
||||
using (var inputStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
|
||||
using (var outputStream = new FileStream(outputTextFilePath, FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
if (isAllText)
|
||||
{
|
||||
using (var memoryStream = new MemoryStream())
|
||||
using (var encryptor = aes.CreateEncryptor())
|
||||
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
|
||||
{
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
cryptoStream.Write(buffer, 0, bytesRead);
|
||||
}
|
||||
cryptoStream.FlushFinalBlock();
|
||||
|
||||
string ivBase64 = Convert.ToBase64String(aes.IV);
|
||||
string cipherBase64 = Convert.ToBase64String(memoryStream.ToArray());
|
||||
string outputText = $"{ivBase64}::{cipherBase64}";
|
||||
|
||||
byte[] outputBytes = Encoding.UTF8.GetBytes(outputText);
|
||||
outputStream.Write(outputBytes, 0, outputBytes.Length);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// IVはバイナリで先頭に書き込む
|
||||
outputStream.Write(aes.IV, 0, aes.IV.Length);
|
||||
|
||||
using (var base64Transform = new ToBase64Transform())
|
||||
using (var cryptoStream = new CryptoStream(outputStream, base64Transform, CryptoStreamMode.Write))
|
||||
using (var encryptor = aes.CreateEncryptor())
|
||||
using (var aesStream = new CryptoStream(cryptoStream, encryptor, CryptoStreamMode.Write))
|
||||
{
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
aesStream.Write(buffer, 0, bytesRead);
|
||||
}
|
||||
aesStream.FlushFinalBlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
resultMessage = "暗号化成功";
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
resultMessage = $"暗号化失敗: {ex.Message}";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool TryDecryptLargeFileFromBase64(string inputTextFilePath, string outputFilePath, out string resultMessage, bool isAllText = false, string password = "")
|
||||
{
|
||||
resultMessage = string.Empty;
|
||||
|
||||
if (string.IsNullOrEmpty(password)) password = SimpleEncryptUxer.FixedPassword;
|
||||
|
||||
try
|
||||
{
|
||||
byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
|
||||
using (var aes = Aes.Create())
|
||||
{
|
||||
aes.Key = key;
|
||||
|
||||
if (isAllText)
|
||||
{
|
||||
string inputText = File.ReadAllText(inputTextFilePath, Encoding.UTF8);
|
||||
string[] parts = inputText.Split(new[] { "::" }, StringSplitOptions.None);
|
||||
|
||||
if (parts.Length != 2)
|
||||
{
|
||||
resultMessage = $"暗号ファイルの形式が不正です(::区切りが見つかりません)";
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] iv = Convert.FromBase64String(parts[0]);
|
||||
byte[] cipherBytes = Convert.FromBase64String(parts[1]);
|
||||
|
||||
aes.IV = iv;
|
||||
|
||||
using (var decryptor = aes.CreateDecryptor())
|
||||
using (var memoryStream = new MemoryStream(cipherBytes))
|
||||
using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
|
||||
using (var outputStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = cryptoStream.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
outputStream.Write(buffer, 0, bytesRead);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var inputStream = new FileStream(inputTextFilePath, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
byte[] iv = new byte[16];
|
||||
inputStream.Read(iv, 0, iv.Length);
|
||||
aes.IV = iv;
|
||||
|
||||
using (var base64Transform = new FromBase64Transform())
|
||||
using (var cryptoStream = new CryptoStream(inputStream, base64Transform, CryptoStreamMode.Read))
|
||||
using (var decryptor = aes.CreateDecryptor())
|
||||
using (var aesStream = new CryptoStream(cryptoStream, decryptor, CryptoStreamMode.Read))
|
||||
using (var outputStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
|
||||
{
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = aesStream.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
outputStream.Write(buffer, 0, bytesRead);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
resultMessage = $"ファイルの復号化に失敗しました。[エラー内容:{ex.Message}]";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool TryEncrypt(string inputFilePath, string outputTextFilePath, out string resultMessage, string password = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
string base64Data = Convert.ToBase64String(File.ReadAllBytes(inputFilePath));
|
||||
|
||||
bool success = SimpleEncryptUxer.Encrypt(base64Data, out var resultText, out var messageForMe, password);
|
||||
resultMessage = messageForMe;
|
||||
|
||||
if (success)
|
||||
{
|
||||
File.WriteAllText(outputTextFilePath, resultText, Encoding.UTF8);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
resultMessage = $"ファイル暗号化失敗: {ex.Message}";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public static bool TryDecrypt(string inputTextFilePath, string outputBinaryFilePath, out string resultMessage, string password = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
string encryptedText = File.ReadAllText(inputTextFilePath, Encoding.UTF8);
|
||||
|
||||
bool success = SimpleEncryptUxer.Decrypt(encryptedText, out var resultText, out var messageForMe, password);
|
||||
resultMessage = messageForMe;
|
||||
|
||||
if (success)
|
||||
{
|
||||
byte[] binaryData = Convert.FromBase64String(resultText);
|
||||
File.WriteAllBytes(outputBinaryFilePath, binaryData);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
resultMessage = $"ファイル復号化失敗: {ex.Message}";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace KssSmaPlaLib.Encryption
|
||||
{
|
||||
public static class SimpleEncryptUxer
|
||||
{
|
||||
public static readonly string FixedPassword = "KssSmaPlaDxer!";
|
||||
private static readonly byte[] FixedIV = new byte[16];
|
||||
|
||||
public static bool TuckIntoMain(string[] args)
|
||||
{
|
||||
if (args.Length != 2) return false;
|
||||
|
||||
if (args[0].ToLower() == "/enc")
|
||||
{
|
||||
if (SimpleEncryptUxer.Encrypt(args[1], out var resultText, out var resultMessage))
|
||||
{
|
||||
Console.WriteLine($"暗号化結果[{resultText}]");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine(resultMessage);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (args[0].ToLower() == "/dec")
|
||||
{
|
||||
if (SimpleEncryptUxer.Decrypt(args[1], out var resultText, out var resultMessage))
|
||||
{
|
||||
Console.WriteLine($"複合化結果[{resultText}]");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine(resultMessage);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool Encrypt(string plainText, out string resultText, out string resultMessage, string password = "")
|
||||
{
|
||||
resultText = string.Empty;
|
||||
resultMessage = string.Empty;
|
||||
password = string.IsNullOrEmpty(password) ? FixedPassword : password;
|
||||
try
|
||||
{
|
||||
byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
|
||||
// 固定IV(簡易仕様とする)※IVはオールゼロ
|
||||
using (var aes = new AesManaged { Key = key, IV = FixedIV })
|
||||
using (var encryptor = aes.CreateEncryptor())
|
||||
{
|
||||
byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);
|
||||
byte[] encryptedBytes = encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length);
|
||||
resultText = Convert.ToBase64String(encryptedBytes);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
resultMessage = $"暗号化に失敗しました。[エラー内容:{ex.Message}]";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool Decrypt(string encryptedText, out string resultText, out string resultMessage, string password = "")
|
||||
{
|
||||
resultText = string.Empty;
|
||||
resultMessage = string.Empty;
|
||||
password = string.IsNullOrEmpty(password) ? FixedPassword : password;
|
||||
try
|
||||
{
|
||||
byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
|
||||
byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
|
||||
using (var aes = new AesManaged { Key = key, IV = FixedIV })
|
||||
using (var decryptor = aes.CreateDecryptor())
|
||||
{
|
||||
byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
|
||||
resultText = Encoding.UTF8.GetString(decryptedBytes);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
resultMessage = $"複合化に失敗しました。[エラー内容:{ex.Message}]";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user