##

###

    DigestBy E.Hooijmeijer1 Inleiding

      Om eventuele stemfraude op te sporen heeft Minister Remkes opdracht gegeven om de uitvoer van
      de stem computers te voorzien van een semi unieke code gebaseerd op de inhoud van de originele
      resultaten. Als een onverlaat de uitslagen mocht aanpassen nadat ze de stemcomputer hebben
      verlaten dan kan dit nu vastgesteld worden.

      Uiteraard zijn er nog vele andere manieren van fraude mogelijk, maar het is belangrijk dat een
      illusie van betrouwbaarheid leeft bij het grote publiek.

    2 Opdracht

      Implementeer de methode 'digest' welke als invoer het originele bericht heeft en een algoritme
      waarmee het bericht moet worden omgezet naar een semi unieke code. Deze algoritmen zijn welbekende
      en doorgeteste algoritmen zoals MD5 en SHA. There is no Security in Obscurity. Gelukkig heeft
      Java een security package met implementaties van deze algoritmen. Dat scheelt weer werk.

      Er zijn een paar uitzonderingen :
      - Als het bericht NULL is dan is de digest ook NULL.
      - Als het algoritme NULL is dan is de digest de hexadecimale representatie van de bericht bytes.
      - Bestaat een algoritme niet dan moet een RuntimeException gegooid worden.

    3 Voorbeeld

      De verkiezingsuitslag is bijvoorbeeld 'PvdA:25%' en het algoritme is NULL dan is de uitkomst
      de hexadecimale representatie van de string bytes : '507664413a323525'. Waarbij de 'P' dan
      overeenkomt met '50'. 0x50 hexadecimaal is 80 in decimale notatie en komt overeen met het
      karakter P.

      De verkiezings uitslag is bijvoorbeeld 'PvdA:25%' en het algoritme is 'SHA' dan is de uitkomst :
      '27f8b8717d72dd8b41493249517bdc42'

    4 Tips

      - de algoritmen zijn al geimplementeerd in de java.security package.
      - De Integer klasse heeft een interesante methode voor het omvormen van integers naar hexStrings.
      - Jammer alleen dat je geen integers hebt..
      - en een byte altijd moet resulteren in 2 hexadecimale digits...

    Test case 1 : NULL Message Test
    Gegeven een NULL uitslag,
    bereken de digest met het algoritme 'SHA'.
    De verwachtte uitkomst is: NULL

    Test case 2 : No algorithm Test I
    Gegeven de uitslag 'PvdA:25%',
    bereken de digest zonder algoritme.
    De verwachtte uitkomst is: '507664413a323525'

    Test case 3 : No algorithm Test II
    Gegeven de uitslag 'VVD:15%',
    bereken de digest zonder algoritme.
    De verwachtte uitkomst is: '5656443a313525'

    Test case 4 : MD5 Test
    Gegeven de uitslag 'PvdA:25%',
    bereken de digest met het algoritme 'MD5'.
    De verwachtte uitkomst is: '27f8b8717d72dd8b41493249517bdc42'

    Test case 5 : SHA Test
    Gegeven de uitslag 'PvdA:25% VVD:15% CDA:20% GroenLinks:12% D66:1% 1NL:8%',
    bereken de digest met het algoritme 'SHA'.
    De verwachtte uitkomst is: 'd128450667705dfeeb69e244c25750635d74d70e'

    Test case 6 : MD2 Test
    Gegeven de uitslag 'PvdA:15% CDA:21% VVD:15% GroenLinks:2% D66:4% 1NL:18%',
    bereken de digest met het algoritme 'MD2'.
    De verwachtte uitkomst is: '632ba83287d278709cd8bb8d45fc5a88'

    Test case 7 : MD5 Test
    Gegeven de uitslag 'PvdA:21% VVD:15% CDA:20% GroenLinks:12% D66:2% 1NL:12%',
    bereken de digest met het algoritme 'MD5'.
    De verwachtte uitkomst is: 'b231f53109b7381b6d9c22945ce00998'

    Test case 8 : SHA-256 Test
    Gegeven de uitslag 'PvdA:22% VVD:1% CDA:20% GroenLinks:8% D66:3% 1NL:1%',
    bereken de digest met het algoritme 'SHA-256'.
    De verwachtte uitkomst is: '62c22ef0bb4318e29529d3c7153949cee2d3328a2397dd2696a2c9ee968704cf'

    Test case 9 : SHA-512 Test
    Gegeven de uitslag 'PvdA:24% VVD:5% CDA:20% GroenLinks:31% D66:2% 1NL:3%',
    bereken de digest met het algoritme 'SHA-512'.
    De verwachtte uitkomst is: 'fb36393f156eee940f9b08327313b3f336d9e7faafdf2c9caba3ce443d20250af7a672d7921dac3f3462e38d6a94f225f8b55b28e26445caba95ad78b6242fdc'

    Test case 10 : XYZ Test
    Gegeven de uitslag 'PvdA:1% VVD:26% CDA:20% GroenLinks:2% D66:3% 1NL:1%',
    bereken de digest met het algoritme 'XYZ'.
    De verwachtte uitkomst is een RuntimeException

    Test case 11 : Hash Hash Test
    Gegeven de uitslag 'PvdA:22% VVD:1% CDA:20% GroenLinks:8% D66:3% 1NL:1%',
    bereken de digest met het algoritme 'SHA-256'.
    Omdat in deze wijk veel hackers wonen wordt het bericht dubbel gehashed.
    De verwachtte uitkomst is: '92dbcfaa822f4c782a11eb021d987f706cf1b02863f4c6d182c760def82731ee'

    Test case 12 : Hash Hash Test II
    Gegeven de uitslag 'PvdA:24% VVD:5% CDA:20% GroenLinks:31% D66:2% 1NL:3%',
    bereken de digest met het algoritme 'SHA-512'.
    Omdat in deze wijk veel hackers wonen wordt het bericht dubbel gehashed.
    De verwachtte uitkomst is: '242d330c7e4db0e7ff175d99f4ac0f95d585ae72214a490505497b3729db1398f38befa818f91bba2496d752be005597d07aea04548f3264c8e9c8f4d5aee876'