Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 10:51 Der er 20 kommentarer og
1 løsning

UUEncoder ignorerer spøjse tegn

Jeg krypterer "hejsa" og får
Encrypted: ×ʰϴ¦

Når jeg UUEncoder det for at sende det over internettet, får jeg:

UUEncoded: 18qwz7Sm

Når jeg decoder igen får jeg
UUDecoded: ×ʰϴ¦

Forskellen er de to uidentificerede " " - de er altså gået tabt i UUEncoding'en. Det er uanset om jeg bruger

UTF-8, iso-8859-1 eller us-ascii

Nogen der ved hvordan jeg sørger for at alting bevares når jeg UUEncoder og UUDecoder? Skriv hvis I vil have kode.
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 10:53 #1
Vi vil have kode ;)
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 10:58 #2
Klart klart, men hvilken kode?
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:01 #3
Hvis jeg UUEncoder almindelig tekst og UUDecoder bagefter er der ingen problemer. Det er kun fordi der er specielle tegn efter jeg har krypteret.

Det samme hvis jeg direkte dekrypterer det jeg har krypteret, så virker det også.

UUEncoding og DES krypteringen virker altså hver for sig
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:02 #4
Min metoder der UUEncoder:

static protected String encodeBase64(String decoded)
    {
            try {
        byte[] uuencode = _uuencode.getBytes();
           
        String temp = new String(decoded.trim());
        byte[] array = temp.getBytes("iso-8859-1");

        int lenUtil = ((temp.length()+2)/3*4);
        int n = 0;
        int i = 0;

        byte[] dest = new byte[lenUtil];

        for(i = 0; i < temp.length()-2; i+=3)
        {
            dest[n++] = uuencode[0xff&(array[i] >> 2) &0x3f];
            dest[n++] = uuencode[0xff&((array[i] & 0x3) << 4) | 0xff&((array[i+1] & 0xf0) >> 4) ];
            dest[n++] = uuencode[0xff&((array[i+1] & 0xf) << 2) | 0xff&((array[i+2] & 0xc0) >> 6) ];
            dest[n++] = uuencode[array[i+2] & 0x3f ];
        }
        if(i < temp.length())
        {
            dest[n++] = uuencode[(array[i] >> 2) &0x3f];
            if( i == temp.length()-1)
            {
                dest[n++] = uuencode[0xff&((array[i] & 0x3) << 4)];
                dest[n++] = (byte) '=';
            }
            else
            {
                dest[n++] = uuencode[0xff&((array[i] & 0x3) << 4) | 0xff&((array[i+1] & 0xf0) >> 4) ];
                dest[n++] = uuencode[0xff&((array[i+1] & 0xf) << 2)];
            }
            dest[n++] = (byte) '=';
        }
        return new String(dest);
            } catch (UnsupportedEncodingException uee) {
                System.out.println("UUEncoding Fejl: "+uee.getMessage());
                return null;
            }
    }
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 11:12 #5
Afleverer din DES-encryption en String? Det burde da være et byte-array,
da vi ellers kan få problemer med UNICODE-tegn i Java.
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:16 #6
public byte[] encryptString( String data )
public String decryptString( byte[] data )
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:17 #7
Men jeg kan jo ikke UUEncode et byte-array, vel? Så på et eller andet tidspunkt bliver jeg vel nødt til at lave det til String.
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 11:22 #8
Jo, du skal kunne uuencode et byte-array - det er præcis det, der giver
mening. 8 bits tegn ved siden af hindanden pakkes ud 6 bit af gangen,
og skrives som normal tegn.
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:24 #9
Der er såmænd også
public synchronized byte[] encrypt( byte[] data )
og
public synchronized byte[] decrypt( byte[] data )
hvis det er - men så kommer problemet med at sende over Nettet, det er det UUEncoding'en er til for.
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 11:29 #10
Ok - men du skal bare direkte tage udgangspunkt i resultatet fra encrypt,
og ikke blande String ind i det, førend du tilsidst skal have det skrevet ud
(der hvor du skriver String(dist) )
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:42 #11
Jeg arbejder nu på byte[] hele vejen igennem og resultatet er en del tættere på. Alligevel er det ikke HELT perfekt, den kan stadig ikke dekryptere hvis jeg UUEncoder og UUDecoder.

Kan du evt. anbefale en anden UUEncoder-tingest som jeg kan bruge på J2ME?
Avatar billede erikjacobsen Ekspert
24. oktober 2003 - 11:47 #12
Kan du lægge et link til hele koden? Jeg får ikke tid, men mon ikke der
kommer andre forbi. Det skal da kunne lade sig gøre ;)
Avatar billede nielsbrinch Nybegynder
24. oktober 2003 - 11:49 #13
Avatar billede arne_v Ekspert
24. oktober 2003 - 15:27 #14
Erstat:

String temp = new String(array).trim();

med:

String temp = new String(array);
Avatar billede arne_v Ekspert
24. oktober 2003 - 15:28 #15
trim fjerner visse tegn.

Ikke noget problem for tekst.

Men et stort problem for encrypted stuff som indeholder random bytes.
Avatar billede arne_v Ekspert
24. oktober 2003 - 15:34 #16
To spørgsmål:

1)  Hvorfor kalder du det uuencode/uudecode når det er base64 encode/decode ?
    (uuencode/uudecoder er noget andet - det er absolut anbefalelsesværdigt
    at bruge base64 fremfor uu, men hvorfor ikke kalde det base64)

2)  Hvorfor kode det selv i.s.f. at bruge javax.mail.internet.MimeUtility ?
    (den kan lave base64 encode og decode - med lidt besvær)
Avatar billede arne_v Ekspert
24. oktober 2003 - 16:06 #17
Eksempel:

    public static byte[] b64encode(byte[] b) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream b64os = MimeUtility.encode(baos, "base64");
        b64os.write(b);
        b64os.close();
        return baos.toByteArray();   
    }
    public static byte[] b64decode(byte[] b) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream(b);
        InputStream b64is = MimeUtility.decode(bais, "Base64");
        byte[] tmp = new byte[b.length];
        int n = b64is.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return res;
    }

Vigtigt: de er *ikke* 100% kompatible med din kode da de her sætter
<CR><LF> ind for hver 756 tegn. Men det kunne man nu også nemt
kode sig udenom.
Avatar billede nielsbrinch Nybegynder
26. oktober 2003 - 17:43 #18
Tak skal du have Arne. Jeg har ikke tid til at teste lige nu, men jeg blev en del klogere. Svar på dine spørgsmål.

1. Fordi jeg ikke kender nogle af delene eller overhovedet kendte ordene for en uge siden ... jeg søgte efter uuencode og fandt base 64 encode, hvilket gjorde jeg antog det var synonymer.

2. Det skal bruges på J2ME - men jeg vil da lige se om jeg kan nuppe Sun's klasse og bruge den, hvis den ikke benytter sig af for mange andre klasser i J2SE.

Tak for dit eksempel. Jeg kan vel bare slette tegnene 757-764 osv? Er det det du mener med at kode sig udenom?
Avatar billede arne_v Ekspert
26. oktober 2003 - 17:46 #19
re 1)

Det er de faktisk ikke. Base64 har afløst uuencode.

re 2)

Ah så giver det mening. MimeUtility er en del af J2EE og kan næppe
bruges i J2ME sammenhæng.
Avatar billede arne_v Ekspert
26. oktober 2003 - 17:51 #20
756 er en slag fejl - det skulle være 75.

Ja - man burde kunne fjerne 76+77, 151+152 etc. (har ikke testet).
Avatar billede nielsbrinch Nybegynder
26. oktober 2003 - 18:02 #21
Ok, men nu er MimeUtility jo J2EE, så pyt!
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