Avatar billede dsj Nybegynder
16. januar 2003 - 22:33 Der 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/

Java-algoritmen:
  public static String oldencrypt(String pass) {
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      return new String( md.digest(pass.getBytes()) );
    } catch (Exception e) {
      Logger.log("Protocol", "Error: unable to encrypt String: "+e.getMessage());
      return null;
    }
  }

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????
Avatar billede arne_v Ekspert
16. januar 2003 - 22:35 #1
Nu ser det umiddelbart ud til at PHP versionen bare er Java
version i hex.

(A = hex 41)

Så måske kan du bare hexificere !
Avatar billede bearhugx Nybegynder
16. januar 2003 - 22:41 #2
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...

/Søren
Avatar billede dsj Nybegynder
16. januar 2003 - 22:46 #3
hvordan får jeg så hex ud af det i stedet?
Avatar billede dsj Nybegynder
16. januar 2003 - 22:47 #4
bearhugx >> og så er fræk at kalde det KLARTEKST !!!! ;)
Avatar billede arne_v Ekspert
16. januar 2003 - 22:47 #5
Du konverterer hver byte i det byte array der returneres af digest
metoden til 2 hexadecimale cifre.
Avatar billede dsj Nybegynder
16. januar 2003 - 22:52 #6
jamen hvordan?? hvilken metode hvorfra?
Avatar billede arne_v Ekspert
16. januar 2003 - 22:54 #7
package test;

import java.security.MessageDigest;

public class MD5 {

    public static void main(String[] args) {
        System.out.println(oldencrypt("Dette er en test !"));
    }

    public static String oldencrypt(String pass) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return toHex(md.digest(pass.getBytes()));
        } catch (Exception e) {
            return null;
        }
    }
    private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
            sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
            sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
}
Avatar billede arne_v Ekspert
16. januar 2003 - 22:55 #8
Prøv og se om ikke det giver samme hex string !
Avatar billede dsj Nybegynder
16. januar 2003 - 23:01 #9
DET var dejlig :D det virker jo perfekt.

Nu har jeg aldrig arbejdet med hex-ting før og var bare det sidste jeg havde lyst til at rode med lige nu så tusind tak.

Bemærk venligst, at man kan tilmelde sig expnote under personlige indstillinger (klienten skal lige have tilrettet sin MD5-algoritme før den er klar)
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:03 #10
ok ... point taken .. Klartekst er måske ikke det rigtige udtryk at bruge i denne sannemhæng :-)

her er en lille 2hex-metode

    public static String toHex(String text) {
        char[] barray = text.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i=0; i<barray.length; ++i) {
            sb.append(Integer.toString(barray[i],16));
        }   
        return sb.toString();
    }

/Søren
Avatar billede arne_v Ekspert
16. januar 2003 - 23:08 #11
bearhugx>

Undgå Integer's konvertering til hex for enhver pris.

"Dette er en test !"

giver "6d74f226ad1c403ed8bf51c461d496ff" med min toHex, men
"6d74-e26-531c403e-28-4151-3c61-2c-6a-1" med din.
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:09 #12
hmmm .. unsign/signed - problematik ???
Avatar billede arne_v Ekspert
16. januar 2003 - 23:10 #13
testet på JDK 1.3.1 (med JCE 1.2.1 for at få MessagesDigest).

Hvordan den programmør der har kodet dette har kunnet få
den ide, at man ville have fortegn med går over min forstand !
Avatar billede arne_v Ekspert
16. januar 2003 - 23:10 #14
Ja fortegn.

Se sidste byte ff versus -1.
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:13 #15
Hmm hos mig har jeg følgende kode, og følgende output (bruger JDK 1.4.1 SE)
Teststreng = "Dette er en test !"

D:\Dev\Source\div java source>java Hex
-D = 44
-e = 65
-t = 74
-t = 74
-e = 65
-  = 20
-e = 65
-r = 72
-  = 20
-e = 65
-n = 6e
-  = 20
-t = 74
-e = 65
-s = 73
-t = 74
-  = 20
-! = 21
446574746520657220656e20746573742021

KODE :
public class Hex {
    public static String toHex(String text) {
        char[] barray = text.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i=0; i<barray.length; ++i) {
            sb.append(Integer.toString(barray[i],16));
            System.out.println(" -"+barray[i]+" = "+Integer.toString(barray[i],16));
        }   
        return sb.toString();
    }
   
    public static void main(String args[]) {
        System.out.println( Hex.toHex("Dette er en test !") );

    }

}


Hos mig laver den ikke fortegn :-/
Avatar billede arne_v Ekspert
16. januar 2003 - 23:14 #16
Jeg kørte på message digest af strengen. Derfor forskellen.

Men det var da godt at har fået det fixet !
Avatar billede arne_v Ekspert
16. januar 2003 - 23:17 #17
Hmm de har ikek fixet dokumentationen.

Min 1.4.1 API doc siger:

#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.

Mystisk !
Avatar billede arne_v Ekspert
16. januar 2003 - 23:18 #18
Hov hov.

Når du kører på den original streng og ikke på digest, så har du ingen
negative værdier !!!!
Avatar billede arne_v Ekspert
16. januar 2003 - 23:18 #19
Prøv lige med ÆØÅ i teksten !
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:19 #20
Ok .. prøver lige selv et MD5 og køre igennem - og der får jeg samme resultat, som dig Arne

OUTPUT :
D:\Dev\Source\div java source>java MD5
DIGEST : mt&#8215;&¡&#8735;@>Ï&#9488;Q&#9472;aÈû
6d74f226ad1c403ed8bf51c461d496ff


KODE

import java.security.*;

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);
    }
}
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:22 #21
Ok  - lavede en teste med danske bogstaver...

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&#9580;K¬çqÊ &#9660;ÜÃÏU
c7afea4ece4baa8771d2001f9ac7d855
Avatar billede arne_v Ekspert
16. januar 2003 - 23:24 #22
Yes.

Men nu har du også konverteret en nibble af gangen og de er
altid positive.

Problemet opstår hvis du konverterer ne byte af gangen.

Mankan sagtens bruge Integer toString, hvis man sikrer sig
at værdien altid er positiv.

Men jeg har gjordt det til en vane altid at undgå Integer toString
når jeg skal konvertere til hex.

Brændt barn sker ilden !
Avatar billede arne_v Ekspert
16. januar 2003 - 23:26 #23
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.
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:28 #24
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...)
Avatar billede arne_v Ekspert
16. januar 2003 - 23:28 #25
Den allerværste ville dog have været:
  sb.append(Integer.toHexString(ba[i]));

Prøv selv !
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:34 #26
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

Derfor får vi samme resultat...
Avatar billede arne_v Ekspert
16. januar 2003 - 23:36 #27
De giver samme resultat.
Avatar billede bearhugx Nybegynder
16. januar 2003 - 23:36 #28
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)
Avatar billede arne_v Ekspert
16. januar 2003 - 23:40 #29
Jeg tror forskellen er meget lille.

Hvis jeg troede på at Integer klassen ville lave noget fornuftigt, så
ville jeg bruge den og betale den smule overhead for at være
standard.

Men jeg har som sagt haft nogle kedelige oplevelser med Integer
og konvertering til hex.

Hvis jeg kludrer i det med mask & shift så får jeg en
exception i.s.f. et "forkert" resultat.

Det foretrækker jeg.
Avatar billede dsj Nybegynder
16. januar 2003 - 23:51 #30
LOOOL i blir ved - klokken er mange tag og gå i seng !!
Avatar billede arne_v Ekspert
17. januar 2003 - 07:32 #31
:-)

Jeg skulle lige have begrundet overfor bearhugx, hvorfor
jeg håndkodede noget som allerede er eller burde være i Java.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester