簡體   English   中英

使用AES / Rijndael將文件加密為Base64格式

[英]Encrypting a file into Base64 format using AES/Rijndael

在DevGlan中, 網址https://www.devglan.com/online-tools/aes-encryption-decryption ,該工具具有一個在線工具,您可以在其中上傳文件,然后使用AES加密將其加密為Base64格式,還可以選擇密碼模式,秘密密鑰和初始化向量。 我想在我的C#Web應用程序中實現相同的目的。 這是我的代碼:

FileUpload3.SaveAs(Server.MapPath(FileUpload3.FileName));
string inputFile = Server.MapPath(FileUpload3.FileName);
byte[] bytesToEncrypt = File.ReadAllBytes(inputFile);
byte[] encryptedBytes = EncryptAESfile(bytesToEncrypt, CipherMode.CBC, keyArray, IV);
string encryptedFileBase64 = Convert.ToBase64String(encryptedBytes);
string encryptedFileHex = BitConverter.ToString(encryptedBytes).Replace("-", "");

    public byte[] EncryptAESfile(byte[] data, CipherMode mode, byte[] key, byte[] iv)
    {
        byte[] encryptedData = null;
        if (data == null)
            throw new ArgumentNullException("data");

        if (data == key)
            throw new ArgumentNullException("key");

        if (data == iv)
            throw new ArgumentNullException("iv");

        using (RijndaelManaged aesAlg = new RijndaelManaged())
        {
            aesAlg.Key = key;
            aesAlg.IV = iv;
            aesAlg.Mode = mode;
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            encryptedData = encryptor.TransformFinalBlock(data, 0, data.Length);
        }

        return encryptedData;
    }

該代碼不返回該文件的Base64編碼字符串,如可變encryptedFileBase64 ,但在參考DevGlan不正確的。 我的代碼僅返回長度為24的Base64字符串,而DevGlan返回近100,000個字符的字符串。 另外,當我測試以查看是否正在讀取字節時,以下代碼返回0,因此問題可能出在我的前幾行:

lblBytes.Text += "Bytes read: " + bytesToEncrypt.Length;

我也看到過許多加密文件的示例(無論是使用AES還是其他對稱加密算法),但沒有返回Base64字符串的文件。 在關閉CryptoStream之前,大多數以這樣的行結尾:

byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);   // The input FileStream
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

參考: 使用AES加密任何文件

有沒有一種方法可以讀取CryptoStream的字節數組,然后將其轉換為Base64,因為我不認為bytearrayinput可以存儲正確的信息。 幫助將不勝感激。 謝謝!

第一:如何創建密鑰? 您是否仔細檢查過鹽是否相同?

另外我還沒有檢查,但是這段代碼應該可以工作:

AesManaged cipher = new AesManaged();
cipher.Mode = MODE;
ICryptoTransform encryptor = cipher.CreateEncryptor(KEY, IV);
MemoryStream to = new MemoryStream();
CryptoStream writer = new CryptoStream(to, encryptor, CryptoStreamMode.Write);

writer.Write(input, 0, input.Length);
writer.FlushFinalBlock();
byte[] encrypted = to.ToArray();
return Convert.ToBase64String(encrypted);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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