Avatar billede solskinsvejr Nybegynder
05. oktober 2004 - 12:12 Der er 14 kommentarer og
1 løsning

Fejl med Kryptering i Java

Hej !!!

Jeg har lavet en chat, som krypterer beskeder mellem sender og modtager. Problemet er bare, at jeg får denne exception: BadPaddingException: Given final block not properly padded

Første gang programmet køres, er der ingen problemer. Jeg har prøvet at teste lidt, og der sker fejl, når man feks. skriver en string som "hehe", "haha" osv. (gentagelser).

Her er koden:

import java.io.*;
import java.net.*;
import java.util.*;

public class Anmodning implements Runnable
{
  private Socket forbindelse;
  Encrypt e;

  Anmodning(Socket forbindelse)
  {
    this.forbindelse = forbindelse;
    e = new Encrypt();
  }

  public void run()
  {
    try {
      PrintWriter ud = new PrintWriter(forbindelse.getOutputStream());
      BufferedReader ind = new BufferedReader(
        new InputStreamReader(forbindelse.getInputStream()));

      String anmodning;
      while ((anmodning = ind.readLine()) != null)
        {
            System.out.println(new Date()+" "+anmodning);
            anmodning = e.runDecrypt(anmodning); //HER KALDES ENCRYPT-KLASSENS runDecrypt-metode MED DEN MODTAGET STRING
            System.out.println(new Date()+" "+anmodning);
            ud.flush();
        }
      forbindelse.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

ENCRYPT-KLASSEN:

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {
    private Cipher aes;
    private SecretKey aeskey;
    Encrypt e;
   
    Encrypt(String key) {
        try {
            Security.addProvider(new com.sun.crypto.provider.SunJCE());
            //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            aes = Cipher.getInstance("AES");
            aeskey = new SecretKeySpec(key.getBytes(), "AES");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    Encrypt()
    {
        e = new Encrypt("hemmelighemmelig");
    }

    private byte[] encrypt(byte[] plaindata) throws Exception {
        aes.init(Cipher.ENCRYPT_MODE, aeskey);
        return aes.doFinal(plaindata);
    }

    private byte[] decrypt(byte[] cipherdata) throws Exception {
        aes.init(Cipher.DECRYPT_MODE, aeskey);
        return aes.doFinal(cipherdata);
    }
   
    public String runEncrypt(String s1) throws Exception
    {
        byte[] b1 = e.encrypt(s1.getBytes());
        String s2 = new String(b1);
        return s2;
    }
   
    public String runDecrypt(String s1) throws Exception
    {
        byte[] b2 = e.decrypt(s1.getBytes());
        String s2 = new String(b2);
        return s2;
    }
}

Håber I kan hjælpe ;o)
Avatar billede arne_v Ekspert
05. oktober 2004 - 12:28 #1
Jeg tror at den siger at når du decrypter så har du ikke hele
messagen.
Avatar billede solskinsvejr Nybegynder
05. oktober 2004 - 12:28 #2
Denne fejl modtager jeg:

Tue Oct 05 12:04:26 CEST 2004 '¥☼L5ó¬n►S┌e{T♀↑
Tue Oct 05 12:04:26 CEST 2004 hej
Tue Oct 05 12:04:27 CEST 2004 b©(ÕK▄Mt─Mf?]éÊ
javax.crypto.BadPaddingException: Given final blo
        at com.sun.crypto.provider.SunJCE_h.b(Das
        at com.sun.crypto.provider.SunJCE_h.b(Das
        at com.sun.crypto.provider.AESCipher.engi
        at javax.crypto.Cipher.doFinal(DashoA6275
        at Encrypt.decrypt(Encrypt.java:34)
        at Encrypt.runDecrypt(Encrypt.java:50)
        at Anmodning.run(Anmodning.java:27)
        at java.lang.Thread.run(Thread.java:534)
Avatar billede solskinsvejr Nybegynder
05. oktober 2004 - 12:30 #3
Fik ikke det hele med...

Tue Oct 05 12:04:26 CEST 2004 '¥☼L5ó¬n►S┌e{T♀↑
Tue Oct 05 12:04:26 CEST 2004 hej
Tue Oct 05 12:04:27 CEST 2004 b©(ÕK▄Mt─Mf?]éÊ
javax.crypto.BadPaddingException: Given final blo
        at com.sun.crypto.provider.SunJCE_h.b(Das
        at com.sun.crypto.provider.SunJCE_h.b(Das
        at com.sun.crypto.provider.AESCipher.engi
        at javax.crypto.Cipher.doFinal(DashoA6275
        at Encrypt.decrypt(Encrypt.java:34)
        at Encrypt.runDecrypt(Encrypt.java:50)
        at Anmodning.run(Anmodning.java:27)
        at java.lang.Thread.run(Thread.java:534)
Avatar billede solskinsvejr Nybegynder
05. oktober 2004 - 12:33 #4
Hej Arne, det er faktisk et eksempel du har skrevet herinde et tidspunkt. Det eneste der er lavet om, er at man kan chatte ved brug af kryptering.
Avatar billede arne_v Ekspert
05. oktober 2004 - 12:33 #5
Du kan f.eks. få fejlen hvis client krypterer 2 linier med et kald
og du forsøger at dekrypter dem hver for sig.
Avatar billede arne_v Ekspert
05. oktober 2004 - 12:34 #6
Ja - jeg synes nok at det så lidt velkendt ud.
Avatar billede arne_v Ekspert
05. oktober 2004 - 12:35 #7
Prøv og check hvad client har som output fra encrypt og sammenlign med
hvad du i server har som input til dekrypt.

Jeg er 75% sikker på at der enten er for lidt eller for meget.
Avatar billede solskinsvejr Nybegynder
05. oktober 2004 - 12:48 #8
Client har det samme output fra encrypt-metoden, som server sender til decrypt-metoden.

Det er ret mærkeligt. Når jeg f.eks. skriver "hej" eller "dav" sker der ingen fejl. Men når jeg skriver med, kommer der altid en fejl. Det er som om der er ord, den ikke kan håndtere. Fatter det ikke !!!
Avatar billede solskinsvejr Nybegynder
05. oktober 2004 - 12:48 #9
"med"
Avatar billede arne_v Ekspert
05. oktober 2004 - 19:33 #10
Two suggestions:

1)  try explicit specifying ISO-8859-1 as character set when converting
    between byte[] and String

2)  Try base64 or hex encode instead of just using it as a string
Avatar billede arne_v Ekspert
17. oktober 2004 - 17:46 #11
Har du prøvet ?
Avatar billede solskinsvejr Nybegynder
17. oktober 2004 - 22:39 #12
Hej Arne, jeg har været på efterårsferie, så har ikke rigtig nået det... Afprøver det i den kommende uge ;o)
Avatar billede solskinsvejr Nybegynder
13. december 2004 - 20:38 #13
Tak for det Arne :o) smid et svar, så du kan få dine point !
Avatar billede arne_v Ekspert
13. december 2004 - 20:40 #14
ok

det virker nu ?
Avatar billede solskinsvejr Nybegynder
13. december 2004 - 21:37 #15
Ja, det skulle vire i bedste velgående nu :o)
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