PremiumPacksInstaller/LibMcCrypt/Crypto.cs

74 lines
2.4 KiB
C#

using System;
using System.IO;
using System.Security.Cryptography;
namespace McCrypt
{
internal class Crypto
{
internal static byte[] Sha256(byte[] data)
{
SHA256 sha256 = SHA256.Create();
byte[] hash = sha256.ComputeHash(data);
sha256.Dispose();
return hash;
}
internal static byte[] Aes256CfbEncrypt(byte[] key, byte[] iv, byte[] data)
{
Aes aes = Aes.Create();
aes.Mode = CipherMode.CFB;
aes.Padding = PaddingMode.None;
aes.BlockSize = 128;
aes.KeySize = 256;
ICryptoTransform aesEncryptor = aes.CreateEncryptor(key, iv);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aesEncryptor, CryptoStreamMode.Write))
{
csEncrypt.Write(data, 0, data.Length);
long totalWritten = data.Length;
while ((totalWritten % 16 != 0))
{
csEncrypt.WriteByte(0);
totalWritten++;
}
msEncrypt.Seek(0x00, SeekOrigin.Begin);
return msEncrypt.ToArray();
}
}
}
internal static byte[] Aes256CfbDecrypt(byte[] key, byte[] iv, byte[] data)
{
Aes aes = Aes.Create();
aes.Mode = CipherMode.CFB;
aes.Padding = PaddingMode.Zeros;
aes.BlockSize = 128;
aes.KeySize = 256;
ICryptoTransform aesDecryptor = aes.CreateDecryptor(key, iv);
using (MemoryStream msDecrypt = new MemoryStream())
{
msDecrypt.Write(data, 0, data.Length);
while (msDecrypt.Length % 16 != 0)
msDecrypt.WriteByte(0);
msDecrypt.Seek(0x00, SeekOrigin.Begin);
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, aesDecryptor, CryptoStreamMode.Read))
{
byte[] plaintext = new byte[msDecrypt.Length];
csDecrypt.Read(plaintext, 0x00, plaintext.Length);
Array.Copy(plaintext, data, data.Length);
return data;
}
}
}
}
}