1

Blowfishアルゴリズムを使用してファイルを暗号化していますが、それについて何も知らないようです。私がしようとするEncipher()と、「無効な長さ」という例外がスローされます。8でmodを取得する場合、長さはゼロでなければならないと考えました。これは、暗号化を開始するために8x8ブロックのストリームが必要であることを意味すると思います。私は何をすべきか?

フグの暗号化法:

public void Encipher(byte[] data, int length)
{
    uint xl, xr;
    if ((length % 8) != 0) <-- Exception Line
        throw new Exception("Invalid Length");
    for (int i = 0; i < length; i += 8)
    {
        // Encode the data in 8 byte blocks.
        xl = (uint)((data[i] << 24) | (data[i + 1] << 16) | (data[i + 2] << 8) | data[i + 3]);
        xr = (uint)((data[i + 4] << 24) | (data[i + 5] << 16) | (data[i + 6] << 8) | data[i + 7]);
        Encipher(ref xl, ref xr);
        // Now Replace the data.
        data[i] = (byte)(xl >> 24);
        data[i + 1] = (byte)(xl >> 16);
        data[i + 2] = (byte)(xl >> 8);
        data[i + 3] = (byte)(xl);
        data[i + 4] = (byte)(xr >> 24);
        data[i + 5] = (byte)(xr >> 16);
        data[i + 6] = (byte)(xr >> 8);
        data[i + 7] = (byte)(xr);
    }
}

私の暗号化方法:

private void EncryptFile(string szFilePath, string szInfoFile, string szKey, string szEncryptedFile = "")
        {
            // Blowfish
            Blowfish alg = new Blowfish(Encoding.Unicode.GetBytes(szKey));

            // Open file
            System.IO.FileStream originalStream = System.IO.File.OpenRead(szFilePath);

            // Store original file length
            long originalLength = originalStream.Length;
            System.IO.File.WriteAllText(szInfoFile, originalLength.ToString());

            Byte[] buffer = new byte[originalStream.Length + (originalStream.Length % 8)];
            originalStream.Read(buffer, 0, buffer.Length);
            originalStream.Close();

            // Encrypt
            alg.Encipher(buffer, buffer.Length);

            string szEncFile;

            if (szEncryptedFile != string.Empty) szEncFile = szEncryptedFile; else szEncFile = szFilePath;

            System.IO.FileStream stream = new System.IO.FileStream(szEncFile, System.IO.FileMode.Create);
            stream.Write(buffer, 0, buffer.Length);
            stream.Close(); 
        }

ありがとう。

4

2 に答える 2

3

値を8で割り切れる次の値に切り上げようとしている場合は、代わりに次のようにする必要があります。

Byte[] buffer = new byte[originalStream.Length + (8-(originalStream.Length % 8))];
于 2012-08-27T14:44:44.370 に答える
2

ピーターリッチーはそれに 答えました。ただし、以下で検討する必要のある慣用的な部分がいくつかあります。1つは、処理中の例外的な状況の場合にリソースを確実に破棄するために、IDisposable実装されたクラス(FileStreamsなど)をブロックでラップすることです。usingもう1つは、if..then1行にまとめたものです。それは本当に..奇妙です。私はそれをあなたが採用している使用法に合うように見える三項演算子に置き換えました。幸運を祈ります。

private void EncryptFile(string szFilePath, string szInfoFile, string szKey, string szEncryptedFile = "")
    {
        // Blowfish
        Blowfish alg = new Blowfish(Encoding.Unicode.GetBytes(szKey));

        // Open file
        using (System.IO.FileStream originalStream = System.IO.File.OpenRead(szFilePath))
        {
            // Store original file length
            long originalLength = originalStream.Length;
            System.IO.File.WriteAllText(szInfoFile, originalLength.ToString());

            Byte[] buffer = new byte[originalStream.Length + (originalStream.Length % 8)];
            originalStream.Read(buffer, 0, buffer.Length);
        }

        // Encrypt
        alg.Encipher(buffer, buffer.Length);

        string szEncFile;

        szEncFile = string.IsNullOrEmpty(szEncryptedFile) ? szFilePath : szEncryptedFile;

        using (System.IO.FileStream stream = new System.IO.FileStream(szEncFile, System.IO.FileMode.Create))
        {
            stream.Write(buffer, 0, buffer.Length);
        }
    }
于 2012-08-27T14:55:16.870 に答える