私の要件は以下の通りです。 手順1)ローカルファイルシステムに101 MBのデータを10〜10 MBのチャンクで暗号化して書き込みたいとします。埋め込みが無効であり、復号化するデータの例外と長さが無効です。 Rijndael
ステップ2)解読中に、ファイルから10-10 MBのデータを取り出したい場合、解読して10-10 MBを他の関数に復号化したいとします(注:最後のチャンクサイズは1 MBですファイルサイズは101 MBです)。私は唯一の10メガバイトを解読しようとすると、それは私がときにNoneにpaddingModeを与えた場合は、エラー、「パディングは無効であり、削除することはできません」解読しながら、今)
2与え
ので
1)最後のチャンクは1MBとなり、「解読するデータの長さは無効です」というエラーが返されます。最大100 MBのものが動作しています
注: 1)最大100 MBのものが期待通りに動作しています。最後のチャンクサイズが1 MBではなく10 MBであれば、最終的に目標ファイルサイズは101 MBではなく110 MBになります。 2)私は暗号化中にパディングモードを与えていませんが、パディングは無効なエラーではなく、解読中は何も与えていません。一時的に私はそのコードをコメントしました。 - エラー
「パディングが無効である
private void WriteStreamInChunks(Stream fsstream, string filePath)
{
int chunkSize = 10 * 1024 * 1024;
byte[] buffer = new byte[chunkSize];
using (var rijndaelManaged = new RijndaelManaged())
{
var encryptor = rijndaelManaged.CreateEncryptor(EncryptionKey, EncryptionIV);
using (var fileStream = File.Create(filePath))
{
using (var cryptoStream = new CryptoStream(fileStream, encryptor, CryptoStreamMode.Write))
{
int bytesRead;
while ((bytesRead = fsstream.Read(buffer, 0, chunkSize)) > 0)
{
cryptoStream.Write(buffer, 0, bytesRead);
}
if (!cryptoStream.HasFlushedFinalBlock)
cryptoStream.FlushFinalBlock();
}
}
}
}
復号化のみチャンクとバイトが[]コードを返す:私は、暗号化と復号化
暗号化コードのために同じキーとIVを使用しています
3) "パディングモードを0に設定した場合、データの長さが無効になります。
public byte[] GetDecryptedFileContent(string filePath, long chunkSizeInBytes, long seekValue, long fileSize, string encryptionIV)
{
var sourceFile = new FileInfo(filePath);
var buffer = new byte[chunkSizeInBytes];
byte[] encryptionKey = File.ReadAllBytes(Utils.GetSymmetricAlgoEncryptionKey());
using (var fileStream = File.Open(sourceFile.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
fileStream.Seek(seekValue, SeekOrigin.Begin);
using (var binaryReader = new BinaryReader(fileStream))
{
binaryReader.Read(buffer, 0, buffer.Length);
}
}
using (MemoryStream dataOut = new MemoryStream())
{
using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
{
//rijndaelManaged.Padding = PaddingMode.None;
ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(encryptionKey, Convert.FromBase64String(encryptionIV));
using (CryptoStream cryptoStream = new CryptoStream(dataOut, decryptor, CryptoStreamMode.Write))
{
cryptoStream.Write(buffer, 0, buffer.Length);
return dataOut.ToArray();
}
}
}
return null;
}
私の要件によると、このGetDecryptedFileContent関数からbyte []を返す必要があります。 私はファイルサイズが0になるまでこの関数を複数回呼び出します。つまり、すべてのチャンクに対してです。 enter code here
誰かが私を助けてくれますか?
私は10から10メガバイトだけ戻したいと思います。
ご回答いただきありがとうございます。 –
お返事ありがとうございます。 ここでやろうとしているのは です。1)すべてのコンテンツを1つに暗号化してファイルに書き出しています。 2)ファイルを解読したいと思います。ファイルサイズが101 MBで、チャンクサイズが20 MBの場合は20-20 MBです。復号化したいデータがあれば、それを返すことにします。 –