簡體   English   中英

嘗試使用AES標准為128時使用8位字節(值最大為256)的AES加密圖片

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM