[英]Attempting to encrypt a picture with AES using 8 bit bytes, values up to 256, when the AES standard is 128
如何轉換我的byte [],以便AES在加密過程中不會破壞圖像? 我正在嘗試使用AES加密圖像。 但是AES的默認大小是128,而不是256。因此,當我加密圖像時,它從13,000的byte []。length開始。 到一個byte []。長度為21,000。 然后,byte []被解密,長度仍然為21,000,並且不顯示。
因此,我試圖在圖像字節[]數組獲得加密並破壞AES之前對其進行調整。 我也從使用UTF8制作的加密管理器中返回值。 這也令人困惑。
如果原始數組是4個值,例如126、126、126、125。則字節數組從加密管理器返回,具有相同的4個值。 但是,如果您發送128、129、129、129、129。返回的byte []是長度的三倍,即12,其值為40/50。
public static byte[] Encrypt(this byte[] information, byte[] keyPass)
{
byte[] key = new byte[keyPass.Length + temp.Length];
Buffer.BlockCopy(keyPass, 0, key, 0, temp.Length);
Buffer.BlockCopy(temp, 0, key, keyPass.Length, temp.Length);
// Make sure parameters are valid
CheckParams(information, key);
Console.WriteLine("KeyCheck");
byte[] encrypted;
string infoString = Encoding.Default.GetString(information);
// Create AES object using key
using (Aes aes = Aes.Create())
{
aes.Key = key;
// Create encryptor
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
// Create streams
using (MemoryStream memoryStream = new MemoryStream())
{
memoryStream.Write(aes.IV, 0, aes.IV.Length);
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
{
streamWriter.Write(infoString);
}
encrypted = memoryStream.ToArray();
}
}
// Return encrypted bytes
return encrypted;
}
public static byte[] Decrypt(this byte[] encrypted, byte[] keyPass)
{
byte[] key = new byte[keyPass.Length + temp.Length];
Buffer.BlockCopy(keyPass, 0, key, 0, temp.Length);
Buffer.BlockCopy(temp, 0, key, keyPass.Length, temp.Length);
// Make sure parameters are valid
CheckParams(encrypted, key);
Console.WriteLine("KeyCheck");
string decrypted;
// Create AES object using key
using (Aes aes = Aes.Create())
{
aes.Key = key;
// Create streams
using (MemoryStream memoryStream = new MemoryStream(encrypted))
{
byte[] iv = new byte[16];
memoryStream.Read(iv, 0, iv.Length);
// Create decryptor
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, iv);
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
using (StreamReader streamReader = new StreamReader(cryptoStream))
{
decrypted = streamReader.ReadToEnd();
}
}
}
// Return decrypted bytes
byte[] decryptedbytes = Encoding.UTF8.GetBytes(decrypted);
return decryptedbytes;
}
我希望能夠在AES中加密然后解密圖像。 如果我嘗試設置aes.KeySize和aes.BlockSize。 它破壞了應用程序。
public byte[] SplitBytes(byte[] bytes)
{
var mask = 0b10000000; // 128
var splitBytes = new byte[bytes.Length * 2];
for (int i = 0; i < bytes.Length; i++)
{
if ((bytes[i] & mask) == mask)
{
splitBytes[i * 2] = (byte)(bytes[i] & ~mask);
splitBytes[i * 2 + 1] = 1;
}
else
{
splitBytes[i * 2] = bytes[i];
}
}
return splitBytes;
}
public byte[] CombineBytes(byte[] bytes)
{
var mask = 0b10000000; // 128
var combinedBytes = new byte[bytes.Length / 2];
for (int i = 0; i < bytes.Length; i += 2)
{
if (bytes[i + 1] == 1)
{
combinedBytes[i / 2] = (byte)(bytes[i] | mask);
}
else
{
combinedBytes[i / 2] = bytes[i];
}
}
return combinedBytes;
}
我想出的解決方案是將字節從之前的256個字節值拆分為128個字節。 使用位運算符AND和NOT。 這使數據經過加密過程,然后在解密后重新組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.