0

Rijndael 暗号化を使用して、あらゆる種類のファイルを暗号化します。新しい .xlsx および .docx ファイルを開こうとすると (暗号化して復号化しようとした後)、エラーがスローされます。Excel 2003 がファイルを開こうとしたときのエラー: "コンバーターはファイルを開けませんでした"。Excel アドオンをインストールしており、暗号化/復号化を使用していない場合、Excel 2003 で xlsx ファイルを開くことができます。

AES を使用するようにコードを変更しましたが、同じタイプの問題があります (ただし、この場合、ファイルはダウンロードされず、Firefox のダウンロード リストにあるだけです)。暗号化/復号化されたファイルのバイトサイズ/長さに注意を払うための提案をここで読みましたが、これを修正する方法について途方に暮れています.xlsファイルをアップロードすると、暗号化されたファイルの長さが異なることがわかります復号化されたファイルが出てきて、xls で保存して開くとうまくいくので、動作するファイルによってこれらの長さが異なるため、これが問題であるかどうかをテストする方法がわかりません。xlsx/docx ファイル暗号化エラーの原因となっている可能性のある問題を誰かが見つけられるかどうかを確認するために、コードを含めています。コードを最小化したので、構文エラーがある場合は、おそらくそれが原因です。

暗号化および復号化された .xlsx ファイルが Excel 2007 で開くかどうかを確認するために、Excel 2007 をインストールしました。ファイルを開こうとすると、次のプロンプトが表示されます。このブックの内容を復元しますか?」Excel 2007 は、「Excel はファイル レベルの検証と修復を完了しました。このブックの一部が修復または破棄された可能性があります」というメッセージでファイルを回復/修復できます。そのため、暗号化/復号化によって無効なファイルが作成されますが、Excel 2007 はこれを修復できます。Excel 2003 コンバーターは、ファイルに対して何もできません。

public byte [] Encrypt(byte [] bytes)
        {
            if (myRijndael == null)
                myRijndael = new RijndaelManaged();
            ICryptoTransform encryptor = myRijndael.CreateEncryptor(key, IV);
            MemoryStream msEncrypt = new MemoryStream();
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
            csEncrypt.Write(bytes, 0, bytes.Length);
            csEncrypt.FlushFinalBlock();
            return msEncrypt.ToArray();
        }

public byte [] Decrypt(byte [] encrypted, string text)
        {
            if (myRijndael == null)
{
                    myRijndael = new RijndaelManaged();
}
            ICryptoTransform decryptor = myRijndael.CreateDecryptor(key, IV);
            MemoryStream msDecrypt = new MemoryStream(encrypted);
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
            byte [] fromEncrypt = new byte[encrypted.Length];
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
            return fromEncrypt;
}


Usage:
ENCRYPT:
ClcCrypto crypt; // Our class for saving keys etc.
ClcCrypto(CLC.WebUtil.ClcCrypto.GetDecryptionKey(), Group.IV);
BinaryReader br = new BinaryReader(NewFile);// NewFile is Stream from filMyFile.PostedFile.InputStream
byte[] EncryptedContents = crypt.Encrypt(br.ReadBytes((int)NewFile.Length));
FileStream fs = File.Create(DestFileName);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(EncryptedContents);
bw.Close();
fs.Close();
br.Close();

DECRYPT (file download):
byte[] baOut = null;
baOut = fiOut.GetFileData(out lLength); // See below for method
Response.AddHeader("content-disposition", "attachment; filename=" + FileName));
Response.ContentType = fiOut.MimeType;
Response.AddHeader("content-length", lLength.ToString());
Response.BinaryWrite(baOut);
Response.End();

public byte[] GetFileData(out long intFileSize)
{
FileStream fsOut = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
      intFileSize = fsOut.Length;
      byte[] Buffer = null;
      ClcCrypto crypt;
      crypt = new CLC.WebUtil.ClcCrypto(CLC.WebUtil.ClcCrypto.GetDecryptionKey(), IV);
      BinaryReader br = new BinaryReader(fsOut);
      Buffer = crypt.Decrypt(br.ReadBytes((int)fsOut.Length), null);
      br.Close();
      fsOut.Close();
      return Buffer;
}
4

2 に答える 2

0

切り捨ての問題のように聞こえます。おそらく、メモリ ストリームの作成方法が原因です。復号化すると、次のようになります

MemoryStream msDecrypt = new MemoryStream();
CryptoStream csDecrypt = new CryptoStream(
    msDecrypt, 
    decryptor, 
    CryptoStreamMode.Write);
csStream.Write(encrypted, 0, encrypted.Length);
csStream.Flush();
return csDecrypt.ToArray();

余分なヌルバイトが追加されていると思いますが、別のアプローチを使用するとこれが軽減される可能性があります。

于 2011-07-13T18:19:29.730 に答える
0

パディングが気になる場合は、次の方法があります。

RijndaelManaged と PKCS5 パディングを使用して vb.net で文字列を暗号化するにはどうすればよいですか?

于 2011-07-12T23:39:54.950 に答える