NKN : Fix alignment/padding for encrypting blocks fixing crashes.
This commit is contained in:
parent
118c90bd8d
commit
c4b785c29f
@ -85,12 +85,26 @@ namespace FirstPlugin
|
|||||||
public void Save(System.IO.Stream stream)
|
public void Save(System.IO.Stream stream)
|
||||||
{
|
{
|
||||||
using (var writer = new BinaryWriter(stream)) {
|
using (var writer = new BinaryWriter(stream)) {
|
||||||
writer.Write(AesEncryption.AesEncrypt(DecryptedContents));
|
AesEncryption.SetKey(AES_KEY);
|
||||||
|
AesEncryption.SetIV(AES_IV);
|
||||||
|
writer.Write(AesEncryption.AesEncrypt(IntoBytes(DecryptedContents)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Unload()
|
public void Unload()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Align the last set of bytes so everything gets encrypted back correctly
|
||||||
|
static byte[] IntoBytes(string contents)
|
||||||
|
{
|
||||||
|
var mem = new MemoryStream();
|
||||||
|
using (var writer = new FileWriter(mem))
|
||||||
|
{
|
||||||
|
writer.Write(Encoding.UTF8.GetBytes(contents));
|
||||||
|
writer.AlignBytes(128);
|
||||||
|
}
|
||||||
|
return mem.ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,13 @@ namespace Toolbox.Library.Security.Cryptography
|
|||||||
IvBytes = UTF8Encoding.UTF8.GetBytes("000000000");
|
IvBytes = UTF8Encoding.UTF8.GetBytes("000000000");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetKey(string key) {
|
public static void SetKey(string key)
|
||||||
|
{
|
||||||
keyBytes = UTF8Encoding.UTF8.GetBytes(key);
|
keyBytes = UTF8Encoding.UTF8.GetBytes(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetIV(string key) {
|
public static void SetIV(string key)
|
||||||
|
{
|
||||||
IvBytes = UTF8Encoding.UTF8.GetBytes(key);
|
IvBytes = UTF8Encoding.UTF8.GetBytes(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,53 +54,31 @@ namespace Toolbox.Library.Security.Cryptography
|
|||||||
|
|
||||||
public static string AesDecrypt(Byte[] inputBytes)
|
public static string AesDecrypt(Byte[] inputBytes)
|
||||||
{
|
{
|
||||||
Byte[] outputBytes = inputBytes;
|
var cryptoTransform = new AesManaged().CreateDecryptor(keyBytes, IvBytes);
|
||||||
|
return Encoding.UTF8.GetString(TransformBlocks(cryptoTransform, inputBytes));
|
||||||
string plaintext = string.Empty;
|
|
||||||
|
|
||||||
using (MemoryStream memoryStream = new MemoryStream(outputBytes))
|
|
||||||
{
|
|
||||||
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, GetCryptoAlgorithm().CreateDecryptor(keyBytes, IvBytes), CryptoStreamMode.Read))
|
|
||||||
{
|
|
||||||
using (StreamReader srDecrypt = new StreamReader(cryptoStream))
|
|
||||||
{
|
|
||||||
plaintext = srDecrypt.ReadToEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return plaintext;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] AesEncrypt(string inputText)
|
public static byte[] AesEncrypt(string inputText) => AesEncrypt(UTF8Encoding.UTF8.GetBytes(inputText));
|
||||||
|
|
||||||
|
public static byte[] AesEncrypt(byte[] inputBytes)
|
||||||
{
|
{
|
||||||
byte[] inputBytes = UTF8Encoding.UTF8.GetBytes(inputText);//AbHLlc5uLone0D1q
|
var cryptoTransform = new AesManaged().CreateEncryptor(keyBytes, IvBytes);
|
||||||
|
return TransformBlocks(cryptoTransform, inputBytes);
|
||||||
|
}
|
||||||
|
|
||||||
byte[] result = null;
|
static byte[] TransformBlocks(ICryptoTransform cryptoTransform, byte[] input)
|
||||||
using (MemoryStream memoryStream = new MemoryStream())
|
{
|
||||||
|
byte[] result = new byte[input.Length];
|
||||||
|
|
||||||
|
int num = 0;
|
||||||
|
while (num < input.Length)
|
||||||
{
|
{
|
||||||
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, GetCryptoAlgorithm().CreateEncryptor(keyBytes, IvBytes), CryptoStreamMode.Write))
|
cryptoTransform.TransformBlock(input, num, 16, result, num);
|
||||||
{
|
num += 16;
|
||||||
cryptoStream.Write(inputBytes, 0, inputBytes.Length);
|
|
||||||
cryptoStream.FlushFinalBlock();
|
|
||||||
|
|
||||||
result = memoryStream.ToArray();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
while (result[0] == (byte)0)
|
||||||
|
result = ((IEnumerable<byte>)result).Skip<byte>(1).ToArray<byte>();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static RijndaelManaged GetCryptoAlgorithm()
|
|
||||||
{
|
|
||||||
RijndaelManaged algorithm = new RijndaelManaged();
|
|
||||||
//set the mode, padding and block size
|
|
||||||
algorithm.Padding = PaddingMode.PKCS7;
|
|
||||||
algorithm.Mode = CipherMode.CBC;
|
|
||||||
algorithm.KeySize = 128;
|
|
||||||
algorithm.BlockSize = 128;
|
|
||||||
return algorithm;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user