import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.util.Random; /** * Test prędkości kryprograficznych funkcji skrótu. * @author Zacheusz Siedlecki * @version 2.0 */ public class MessageDigestBenchmark { MessageDigest messageDigest; /** * Liczba bloków tekstu jawnego dla którego będą obliczane skróty. */ int blockCount; /** * Długość pojedynczego bloku tekstu jawnego. */ int blockLength; /** * Wylosowane bloki tekstu jawnego. */ byte[][] plaintext; /** * Obliczone skróty. Do przyszłego zastosowania. */ byte[][] digest; /** * Generator pseudolosowy generujący zestaw danych testowych. */ static final Random random = new Random(7L);//System.currentTimeMillis()); public void setMD(String alg) throws NoSuchAlgorithmException { this.messageDigest = MessageDigest.getInstance(alg); } public void setMD(String alg, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { if (provider == null) { setMD(alg); } else { this.messageDigest = MessageDigest.getInstance(alg, provider); } } public String getProviderName(){ return messageDigest == null ? null : messageDigest.getProvider().getName(); } /** * Generuje (losuje) zestaw danych testowych. * @param blockCount liczba bloków tekstu jawnego dla którego będą * obliczane skróty * @param blockLength długość pojedynczego bloku tekstu jawnego. */ public void generatePlainData(int blockCount, int blockLength) { if (blockCount != this.blockCount) { this.blockCount = blockCount; newBlockArrays(); } this.blockLength = blockLength; randPlaintext(); } /** * Test prędkości działania algorytmu. * @return smuaryczny czas obliczania skrótów dla wszystkich bloków * @throws java.lang.Exception */ public long test() throws Exception { long start = System.currentTimeMillis(); for (int i = 0; i < blockCount; i++) { // zapamiętuje skrót (do przyszłego zastosowania) digest[i] = messageDigest.digest(plaintext[i]); } long time = System.currentTimeMillis() - start; return time; } private void randPlaintext() { for (int i = 0; i < blockCount; i++) { plaintext[i] = new byte[blockLength]; random.nextBytes(plaintext[i]); if (plaintext[i][0] == 0) { plaintext[i][0] = 1; } } } private void newBlockArrays() { plaintext = new byte[blockCount][]; digest = new byte[blockCount][]; } public static void main(String[] a) throws Exception { if (a.length < 3) { throw new Exception ("Missing arguments."); } String alg = a[0]; int blockCount = Integer.parseInt(a[1]); int blockLength = Integer.parseInt(a[2]); String provider = a.length > 3 ? a[3] : null; MessageDigestBenchmark tester = new MessageDigestBenchmark(); tester.generatePlainData(blockCount, blockLength); tester.setMD(alg, provider); System.out.println(alg + ",\t" + tester.getProviderName() + ",\t" + blockCount + ",\t" + blockLength + ",\t" + tester.test());//10438 } }