Avatar billede phbecker Nybegynder
06. november 2007 - 20:00 Der er 6 kommentarer

RSA-kryptering og dekryptering i Java!

Jeg prøver i Java at kryptere en tekststreng (lavet om til byte-array), der fylder 48 bytes med en 1024-bits RSA-nøgle (et PublicKey-objekt i Java). Dette producerer et output, som er 256 bytes langt, men når jeg prøver at dekryptere output'et med den tilsvarende PrivateKey, får jeg en "javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes"-fejlbesked.

Hvordan kan det være, og hvad kan jeg gøre ved det? Hvis nøglen er for lille, beskeden for lang, eller noget helt tredje, hvad kan da gøres?
Avatar billede arne_v Ekspert
06. november 2007 - 20:16 #1
Mystisk. Det fylder kun 128 krypteret hos mig.

Demo kode:

package november;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class RSA {
    public static void main(String[] args) {
        try {
            String s = "123456789012345678901234567890123456789012345678";
            byte[] plain = s.getBytes("ISO-8859-1");
            System.out.println(s);
            System.out.println(plain.length);
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(1024);
            KeyPair kp = kpg.generateKeyPair();
            PrivateKey priv = kp.getPrivate();
            PublicKey pub = kp.getPublic();
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pub);
            byte[] code = cipher.doFinal(plain);
            System.out.println(code.length);
            cipher.init(Cipher.DECRYPT_MODE, priv);
            byte[] plain2 = cipher.doFinal(code);
            System.out.println(plain2.length);
            String s2 = new String(plain2, "ISO-8859-1");
            System.out.println(s2);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede phbecker Nybegynder
06. november 2007 - 20:32 #2
Ah ja, jeg har fundet fejlen! Jeg bruger en funktion til at repræsentere ciphertext som en hex-streng, hvilket gør den dobbelt så lang. Altså lå problemet slet ikke her - jeg gør nemlig sagerne præcis som i dit kodeeksempel.

Mange tak for hjælpen, du kan jo få lidt point alligevel ;)
Avatar billede phbecker Nybegynder
06. november 2007 - 20:36 #3
Kunne du evt. byde på en måde at lave byte array'et, der indeholder ciphertext, om til en streng af printbare tegn med samme længde? (hvis det kan lade sig gøre)
Avatar billede phbecker Nybegynder
06. november 2007 - 20:38 #4
Jeg tænker i særdeleshed på "tegn" i ciphertext, der printes som newlines (selvom det selvfølgelig egentlig er en ulæselig række bits/bytes). Jeg indsætter nemlig ciphertext andetsteds for at teste noget. Giver det mening? :-)
Avatar billede arne_v Ekspert
06. november 2007 - 20:45 #5
Du kan ikke konvertere N vaerdier 0-255 til N vaerdier 32-126.

Hex giver +100%.

Med base64 kan du noejes med +33%.
Avatar billede arne_v Ekspert
07. november 2007 - 01:34 #6
og et svar
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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