Par MD5 algoritmu

Apskatieties algoritma aprakstu: RFC1321. Demonstrācija, kura rēķina MD5 vertības ir MD5Test.java. Ja to darbina komandrindas argumentam, tā rēķina MD5 funkciju no dota argumenta. Ja to darbina bez argumentiem, ta rēķina MD5 septiņiem testu piemēriem no RFC1321 un salīdzina ar pareizajām vērtibam. Ja uz Jūsu platformas MD5 nedarbojas, vai nav pareizi RFC1321 testu piemēri, tad ieteicams MD5 programmēt pašiem. Ka iedvesmas avotu var izmantot MD5.java - Apache implementāciju, kuru tomēr nevar sakompilet (atsaucas uz novecojušu java.security paketi un izmanto ari citu klasi org.apache.java.lang.Bytes, kuras mums nav).

/*
 * Fails MD5Test.java
 * Sk. arī piemēru:
 * http://developer.java.sun.com/developer/qow/archive/28/index.html 
 */ 

import java.io.*;
import java.security.*;
        
public class MD5Test {

    /*********************** Self Test ***********************/

    private static String[] messages =
    {
        "",
        "a",
        "abc",
        "message digest",
        "abcdefghijklmnopqrstuvwxyz",
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
        "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
    };

    private static String[] digests =
    {
        "d41d8cd98f00b204e9800998ecf8427e",
        "0cc175b9c0f1b6a831c399e269772661",
        "900150983cd24fb0d6963f7d28e17f72",
        "f96b697d7cb7938d525a2f31aaf161d0",
        "c3fcd3d76192e4007dfb496cca67e13b",
        "d174ab98d277d9f5a5611c2c9f419d9f",
        "57edf4a22be3c955ac49da2e2107b67a",
    };


	public static void main(String args[]) {
		if (args.length >= 2) {
			System.err.println("Lietojums: java MD5Test testvalue\n" 
				+ "vai arī: java MD5Test");
			System.exit(1);
		}

		MessageDigest algorithm = null;
		try {
			algorithm = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			System.out.println(e.toString());
		}

		if (args.length == 0) {
			System.err.println("Testu virkne:");
			for (int i = 0; i < messages.length; i++) {
				// Šīs divas rindas OBLIGĀTI jāizsauc 
				// pirms katra MD5 daidžesta rēķināšanas
				algorithm.reset();
				byte[] buf = messages[i].getBytes();
				// pabarojam MD5 algoritmu ar baitiem (to var darīt arī atkārtoti)
				algorithm.update(buf);
				// savācam MD5 rezultātu (līdz ar šo darbību algoritms resetojas)
				byte[] digest = algorithm.digest();
				// izdrukā glīti rezultātu (un salīdzina ar to, kurš minēts MD5 dokumentācijā)
				System.err.println("digest(" + messages[i] + ")=" + bytesToString(digest));		
				System.err.println("    jaabuut: " + digests[i]); 
			}
		}

		else {
			byte[] buf = args[0].getBytes();
			// Šīs divas rindas OBLIGĀTI jāizsauc 
			// pirms katra MD5 daidžesta rēķināšanas
			algorithm.reset();
			algorithm.update(buf);
			byte[] digest1 = algorithm.digest();
			System.err.println("digest(" + args[0] + ")=" + bytesToString(digest1));
	    }
	}

	/**
	 * Pārveido baitu masīvu par heksadecimālu stringu
	 */
	public static String bytesToString(byte[] digest) {
		char[] hexdigits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
		char[] result = new char[2*digest.length];
		for (int i=0; i<digest.length; i++) {
			// vecākie 4 biti
			result[2*i] = hexdigits[(digest[i] & 0xf0)/16]; 
			// jaunākie 4 biti
			result[2*i+1] = hexdigits[digest[i] & 0x0f];
		}
		return new String(result);
	}
}

MD5 daidžestus izmanto, piemēram, CHAP protokolā autentifikācijai, neizpaužot paroli.


Lapa mainīta 2004-12-02 22:00:21