16. januar 2003 - 22:33Der er
30 kommentarer og 1 løsning
Problem med MD5
Jeg har et problem med noget md5-kryptering.
Hvis jeg i java MD5-krypterer en String med nedenstående algoritme, får jeg et helt andet resultat end hvis jeg f.eks. krytpere i PHP (stadig MD5) eller her: http://robotten.dk/
I java får jeg noget der ligner: 'A«kñóˆßµÍ(/·l' mens jeg i på robotten.dk eller i PHP får noget der ligner '41ab1b1d6bf108f388dfb5cd282fb76c', altså hexidecimaler.
Hvordan får jeg i java MD5krypteret, så det ligner det andet????
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Det er det samme indhold - det ene er bare i klartekst - det andet i hex-decimal notation ..
Evt. hvis man er usikker på kildenernes format, så kan man teste om den ene er hex, og så evt. lave Java-kodens output til hex-string - og så foretage sammenligning...
#public static String toString(int i, # int radix) # # Returns a string representation of the first argument in the radix specified by the second argument.
# If the radix is smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX, then the radix 10 is used instead.
# If the first argument is negative, the first element of the result is the ASCII minus character '-' ('\u002D'). If the first argument is not negative, no #sign character appears in the result.
public class MD5 { public static void main(String[] args) throws Exception { byte[] digest = MessageDigest.getInstance("MD5").digest("Dette er en test !".getBytes()); System.out.println(" DIGEST : "+ new String(digest) ); StringBuffer s = new StringBuffer(); for (int i = 0; i < digest.length; i++) { s.append(Integer.toString((digest[i] & 0xf0) >> 4, 16)); s.append(Integer.toString(digest[i] & 0x0f, 16)); } System.out.println(s); } }
I ovenstående kode er følgende erstatning byte[] digest = MessageDigest.getInstance("MD5").digest("Dette er en test ! -- FOR ARNE : Æ Ø Å æ ø å".getBytes());
Output af denne er : D:\Dev\Source\div java source>java MD5 DIGEST : ûÛN╬K¬çqÊ ▼ÜÃÏU c7afea4ece4baa8771d2001f9ac7d855
Hvis jeg skal pinde det ud: sb.append(Integer.toString(barray[i],16)); har problemet men: s.append(Integer.toString((digest[i] & 0xf0) >> 4, 16)); s.append(Integer.toString(digest[i] & 0x0f, 16)); er OK.
Jeg kan se, at du shifter 4 inden du AND'er når du skal have High-order bitsne - jeg AND'er inden jeg shifter 4 .... Er en af vores metoder forkert - eller vil de få samme resultat ?
(vil gerne vide, om jeg skal rette noget af min kode...)
ovenstående i din kode, altså istedet for sb.append(hexdigit[(ba[i] >> 4) & 0x0F]); sb.append(hexdigit[ba[i] & 0x0F]);
eller
--- Har fundet ud af det med shiftingen --- Det er fordi du AND'er to gange med 0x0f - (to gange LSN (least significant nibble)) og jeg AND'er MSN og derefter LSN
Jeg er dog sikker på, at din metode er langt mere optimeret (hastighedsmæssigt) -- opslag i en array er helt sikkert en kende hurtigere end metodekald (som sikkert laver lignende opslag selv alligevel)
Jeg skulle lige have begrundet overfor bearhugx, hvorfor jeg håndkodede noget som allerede er eller burde være i Java.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.