首页 > 解决方案 > 当 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。它破坏了应用程序。

标签: c#xamarin.formsbyteaes

解决方案


    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。这让数据经过加密过程,然后在解密后重新组合。


推荐阅读