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);
参考:Encrypting any file using AES
有没有一种方法可以读取CryptoStream的字节数组,然后将其转换为Base64,因为我看不到bytearrayinput
会单独存储正确的信息。帮助将不胜感激。谢谢!
答案 0 :(得分:0)
第一:如何创建密钥?您是否仔细检查过盐是否相同?
我还没有检查,但是此代码应该可以工作:
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);