0

XTEA アルゴリズムを使用して暗号化/復号化プログラムを作成しています。暗号化/復号化機能は正常に機能しますが、ファイルを暗号化してから復号化すると、ファイルの末尾に余分な文字が表示されます。

--- Original file ---
QwertY

--- Encrypted file ---
»¦æŸS@±­

--- Deciphered from encrypted ---
QwertY  ß*tÞÇ

最後に「 ß*tÞÇ 」が表示される理由がわかりません。コードの一部を投稿しますが、長すぎるため、すべてではありません。暗号化/復号化関数は、64 ビットのデータと 128 ビットの鍵を受け取り、データを同じブロック サイズ (これも 64 ビット) に暗号化/復号化します (同様の関数はこちら)。その後、新しいファイルに書き込むことができます。

    long data[2]; // 64bits
    ZeroMemory(data, sizeof(long)*2);
    char password[16];
    ZeroMemory(password, sizeof(char)*16);

    long *key;
    if(argc > 1)
    {
        string originalpath = argv[1];
        string finalpath;
        string eextension = "XTEA";
        string extension = GetFileExtension(originalpath);
        bool encipherfile = 1;

        if(extension.compare(eextension) == 0) // If extensions are equal, dont encipher file
        {
            encipherfile = 0;
            finalpath = originalpath;
            finalpath.erase(finalpath.length()-5, finalpath.length());
        }

        ifstream in(originalpath, ios::binary);
        ofstream out(finalpath, ios::binary);

        cout << "Password:" << endl;
        cin.get(password,sizeof(password));
        key = reinterpret_cast<long *>(password);

        while(!in.eof())
        {
            ZeroMemory(data, sizeof(long)*2);
            in.read(reinterpret_cast<char*>(&data), sizeof(long)*2); // Read 64bits from file

            if(encipherfile == 1)
            {
                encipher(data, key);
                out.write(reinterpret_cast<char*>(&data), sizeof(data));
                continue;
            }
            if(encipherfile == 0)
            {
                decipher(data, key);
                out.write(reinterpret_cast<char*>(&data), sizeof(data));
            }
        }
4

1 に答える 1

0

eof読み取りの直後eofと、ループから抜け出すかどうかを確認します。

部分的な読み取り (つまり、要求されたすべてのバイトよりも少ない読み取りが可能な場合) がある場合は、gcount実際に読み取ったバイト数を調べるためにも呼び出す必要があります。したがって、次のようになります。

cin.read( ... )
if( cin.eof() )
    {
    streamsize bytesRead = cin.gcount();
    if( bytesRead > 0 )
       // process those bytes
    break;
    }
于 2012-04-09T12:59:36.913 に答える