Java Функция копирования MD5 генерирует другой дайджест - PullRequest
0 голосов
/ 07 августа 2020

Я экспериментирую с Java и создал небольшую программу, которая копирует файл и генерирует контрольную сумму MD5. Программа работает и генерирует контрольную сумму, но полученный файл, который копируется, не соответствует исходной контрольной сумме.

Я новичок в Java и не понимаю, в чем проблема. Я записываю неправильный буфер в выходной файл?

package com.application;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.security.MessageDigest;

public class Main {

    static int secure_copy(String src, String dest) throws Exception {
        InputStream inFile = new FileInputStream(src);
        OutputStream outFile = new FileOutputStream(dest);
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] buf = new byte[1024];
        int numRead;

        do {
            numRead = inFile.read(buf);
            if (numRead > 0) {
                md.update(buf, 0, numRead);
                outFile.write(buf);
                outFile.flush();
            }
        } while (numRead != -1);

        inFile.close();
        outFile.close();

        BigInteger no = new BigInteger(1, md.digest());
        String result = no.toString(16);
        while(result.length() < 32) {
            result = "0" + result;
        }

        System.out.println("MD5: " + result);
        return 0;
    }

    public static void main(String[] args) {
        try {
            secure_copy(args[0], args[1]);
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

Вывод из исходного файла: (Правильно)

MD5: 503ea121d2bc6f1a2ede8eb47f0d13ef

Файл из функции копирования, проверенный через md5sum

md5sum file.mov 
56883109c28590c33fb31cc862619977  file.mov

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Вы записываете весь буфер в выходной файл, а не только часть, содержащую данные из последнего чтения. Исправить просто:

        if (numRead > 0) {
            md.update(buf, 0, numRead);
            outFile.write(buf, 0, numRead);
        }
0 голосов
/ 07 августа 2020

При каждом чтении из InputStream код постоянно изменяет данные для вычисления ha sh. Вместо вызова md.update(buf, 0, numRead); в l oop, он должен прочитать весь файл в byte[], а затем вызвать md.update(entireFileByeArray) один раз. (См. этот ответ , чтобы узнать, как найти подходящий размер массива перед открытием файла.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...