Avatar billede lillholm Nybegynder
18. februar 2008 - 11:21 Der er 15 kommentarer og
1 løsning

Udregning af MSCASH

I et led fra et tidligere spørgsmål(http://www.eksperten.dk/spm/819372) her på eksperten er jeg på jagt efter hvordan jeg "løser" den streng der.

MSCASH = MD4( MD4(password ) || lowercase(username) )

Lad os antage jeg har et username og password der hedder
user og password

Hvad vil MSCASH blive? Har brugt en hel aften med alt muligt forskelligt gejl men kan ikke komme frem til det rigtige resultat.

Maaske det ikke er den rigtige maade at goere det paa ?
Avatar billede arne_v Ekspert
18. februar 2008 - 19:53 #1
Hvis sker nogle tranformeringer til hex eller base64 i de midlertidige beregninger
og tegnsæt er US-ASCII/ISO-8859-1/UTF-8, så vil det endelige resultat være:

ef3f91a037ba1513a8572c3dbcb018b5 i hex

7z+RoDe6FROoVyw9vLAYtQ== i base64
Avatar billede arne_v Ekspert
18. februar 2008 - 19:59 #2
hvis DER IKKE sker ...
Avatar billede lillholm Nybegynder
23. februar 2008 - 09:58 #3
Det ser maaske rigtigt ud. Eneste problem hvordan jeg faar de tegnsaet med ind i min kode?

Jeg har lige lavet dette lille perl script. Kunne ogsaa vaere saa meget andet.
----------------------------
use Digest::MD4 qw(md4 md4_hex md4_base64);
print md4_hex(md4_hex("password") || lowercase("user")),"\n";
----------------------------
Og det her er saa hvad jeg faar ud af det.
143409f027a6cfde772e3c97b126d9f5

hvordan kan jeg definere hvilke tegnsaet den skal bruge ?
Avatar billede arne_v Ekspert
23. februar 2008 - 23:59 #4
skal:

print md4_hex(md4_hex("password") || lowercase("user")),"\n";

ikke være:

print md4_hex(md4_hex("password") . lc("user")),"\n";

?

(det giver 200677efff76ec27e716b319b611e217 fordi den første MD4 bliver hexet)
Avatar billede lillholm Nybegynder
25. februar 2008 - 17:30 #5
hej arne.

Det ser meget fornuftigt ud. Giver bare stadig ikke det rigtige.

Nu fandt jeg det forum hvor jeg har kunne finde mest information omkring det men jeg kan stadig ikke gennemskue det.

Maaske du kan ?

http://antionline.com/archive/index.php/t-271373.html

-----------------------------------------
The MSCASH is built as follows:

1. pad "username" to 64 unicode chars (128 byte)

There is no lowercasing of the username. However, it is made sure that
the order is little-endian. I think, but I am not completely sure, that this
was the confusion for the "lowercase-assumption".

2. take the MD4-hash of the unicoded password (16 unicode chars = 32 bytes)

3. Append the 128-byte tabbed unicoded username to "MD4(password)"

4. take the MD4-hash of the unicoded version of the construct in step 3.

Done.
----------------------------------------
hvad skal det betyde naar han skriver unicode chars?
Avatar billede arne_v Ekspert
26. februar 2008 - 00:18 #6
Når jeg bruger Unicode (UTF-16) så får jeg:
  6964c4212603e0119e5548166c4a0cf0
Avatar billede arne_v Ekspert
26. februar 2008 - 00:19 #7
Jeg har dog ikke padded, da jeg ikke ved hvad der skal paddes med.
Avatar billede lillholm Nybegynder
26. februar 2008 - 06:47 #8
Men hvordan faar jeg Unicode ind i min kode?
Avatar billede arne_v Ekspert
27. februar 2008 - 05:14 #9
Din Perl kode ?
Avatar billede lillholm Nybegynder
27. februar 2008 - 17:31 #10
ja fx min perlkode.

Kan ogsaa bruge et eksempel i C / C++

er bare i tvivl om hvordan.
Avatar billede lillholm Nybegynder
04. marts 2008 - 07:17 #11
arne_v

kom med et svar :) du fortjener sgu de point der.. Jeg har fattet en del mere af det nu.
Avatar billede arne_v Ekspert
05. marts 2008 - 03:29 #12
Jeg har leget lidt videre.

Nu tror jeg faktisk at "password" og "user" uden padding skal give:

2d9f0b052932ad18b87f315641921cda

Jeg kan ikke lave koden i Perl.

Men her er den i Java:

import java.security.MessageDigest;
import java.security.Security;

public class SpecialMD4 {
    public static void main(String[] args) throws Exception {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        MessageDigest md = MessageDigest.getInstance("MD4");
        byte[] tmp1 = md.digest("password".getBytes("UTF-16LE"));
        byte[] tmp2 = "user".toLowerCase().getBytes("UTF-16LE");
        byte[] tmp = new byte[tmp1.length + tmp2.length];
        System.arraycopy(tmp1, 0, tmp, 0, tmp1.length);
        System.arraycopy(tmp2, 0, tmp, tmp1.length, tmp2.length);
        System.out.println(toHex(md.digest(tmp)));
    }
    public 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();
    }
}

og i C:

#include <stdio.h>
#include <wchar.h>

#include <openssl/md4.h>

void digest(char *buf, size_t buflen, char *md)
{
    MD4_CTX ctx;
    MD4_Init(&ctx);
    MD4_Update(&ctx, buf, buflen);
    MD4_Final(md, &ctx);
}

int main()
{
    int i;
    char tmp[24],res[16];
    digest((char*)L"password", 2*wcslen(L"password"), tmp);
    wcscpy((wchar_t*)(tmp + 16), L"user");
    digest(tmp, sizeof(tmp), res);
    for(i = 0; i < 16; i++)
    {
        printf("%02x", (unsigned char)res[i]);
    }
    printf("\n");
    return 0;
}
Avatar billede arne_v Ekspert
05. marts 2008 - 03:29 #13
Og et svar
Avatar billede arne_v Ekspert
05. marts 2008 - 03:29 #14
C koden mangler tolower
Avatar billede arne_v Ekspert
05. marts 2008 - 03:30 #15
og den antager at wchar_t er 2 bytes
Avatar billede lillholm Nybegynder
06. marts 2008 - 15:27 #16
ok.. prøver at lege med det.

Ser godt ud :D
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