c# - 当 AES 标准为 128 时,尝试使用 8 位字节使用 AES 加密图片,值高达 256
问题描述
如何转换我的 byte[] 以便 AES 在加密期间不会破坏图像?我正在尝试使用 AES 加密图像。但是 AES 的默认大小是 128 而不是 256。所以当我加密我的图像时,它的 byte[].length 为 13,000。到 byte[].length 为 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。这让数据经过加密过程,然后在解密后重新组合。
推荐阅读
- sails.js - How to fix error caused by userconfig probably by sails?
- bash - How can I invoke both BASH and CSH shells in a same script
- php - 使用php从MySQL中选择并打印数据,不起作用
- c# - 具有 2 个时间数据的 LinkedList
- html - CSS文件未在浏览器中更新
- android - Android资产,我如何从子文件夹中读取文件?
- amazon-web-services - 我应该做很多较小的请求,还是使用 s3 做更少但更大的请求来传递数据
- python-3.x - 在 xlib 上使用 ctypes 时出现分段错误
- node.js - 如何将 node.js express 服务器转换为 AWS lambda?
- php - 如何修复 PHP 中的未定义变量错误