Avatar billede nickl87 Nybegynder
19. august 2007 - 14:04 Der er 5 kommentarer

PBE encryption med BC til java 1.6

Hej

Jeg er i færd med at lave et program som skal kunne tage en vilkårlig fil og kryptere den i henhold til en vilkårlig brugervalgt kode.

Jeg har dog nogle problemer med dette:

- Jeg får hele tiden en java.security.InvalidKeyException, hvilket kan skyldes jeg ikke har installeret JCE. Er dette virkelig nødvendigt når jeg bruger BC som provider?

- Jeg synes ikke jeg kan finde noget decideret kode eksempel hvor man kryptere en fil via PBE, kan dette virkelig passe?

- Sidst men ikke mindst, hvis jeg skal bruge JCE, er det så muligt at installere denne ved runtime, som f.eks. bouncy castle?

mvh.
Nick
Avatar billede arne_v Ekspert
19. august 2007 - 16:51 #1
Den fejl plejer at skyldes at key har en forkert længde f.eks. hvis den skal
være 8 eller 16 byte.
Avatar billede nickl87 Nybegynder
22. august 2007 - 20:03 #2
Har jeg prøvet, desværre har en ændring ingen virkning :S

Har dog noget kode som jeg fik her inde for et stykke tid siden, tror faktisk det var af dig, som virker, bortset fra at koden som man kryptere efter skal være 16 byte lang.

koden ses her:

public class AES {
    private static void crypt(int mode, String fromname, String toname, String key) throws Exception {
        Cipher aes = Cipher.getInstance("AES");
        aes.init(mode, new SecretKeySpec(key.getBytes("UTF-8"), "AES"));
        InputStream is = new FileInputStream(fromname);
        OutputStream os = new FileOutputStream(toname);
        byte[] b = new byte[10000];
        int n;
        while((n = is.read(b)) >= 0) {
            byte[] b2;
            if(n < b.length) {
                b2 = aes.doFinal(b, 0, n);
            } else {
                b2 = aes.update(b, 0, n);
            }
            os.write(b2, 0, b2.length);
            System.out.println(n + " " + b2.length);
        }
        is.close();
        os.close();
    }
    public static void encrypt(String fromname, String toname, String key) throws Exception {
        crypt(Cipher.ENCRYPT_MODE, fromname, toname, key);
    }
    public static void decrypt(String fromname, String toname, String key) throws Exception {
        crypt(Cipher.DECRYPT_MODE, fromname, toname, key);
    }
    public static void main(String[] args) throws Exception {
        encrypt("/home/nick/z.1", "/home/nick/z.2", "Top hemmelig key");
        decrypt("/home/nick/z.2", "/home/nick/z.1", "Top hemmelig key");
    }
}

Er der en nem måde at sørge for en vilkårlig bruger indtastet kode altid kan laves om til en 16 byte lang kode?
Avatar billede arne_v Ekspert
22. august 2007 - 20:17 #3
Der er flere muligheder.

Et par tilfaeldige:

* lave en MD5 hash af den kode brugeren vaelger

* tag Java String hashCode af den kode som brugeren vaelger, brug den som seed for
  Random og generere 16 bytes
Avatar billede arne_v Ekspert
22. august 2007 - 20:24 #4
Hvis du viser den PBE kode som ikke virker kan jeg maaske ogsaa finde en loesning til det,
men det er nemmest hvis du kan give et 25 linier eksempel som illusterer problemet.
Avatar billede arne_v Ekspert
22. september 2007 - 21:23 #5
nick ?
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