Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Codice RSA di Java

  1. #1

    Codice RSA di Java

    Salve a tutti,
    in questo ultimo periodo mi sono interessato alla crittografia/decrittografia, un argomento molto importante della sicurezza informatica. Così mi sono documentato sulla RSA e ho trovato un codice bellino in Java. L'ho guardato e tentato di compilarlo ma mi dava una lista di errori che non capisco... Posto qui il codice per correttezza:


    import java.io.*;
    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import java.math.BigInteger;
    import java.security.SecureRandom;

    public class RSA {

    private static byte[] pad(byte[] msg,int blockSize) {
    //Verifica che il messaggio sia adeguato per lo schema PKCS#5
    if (blockSize<1||blockSize>255)
    throw new IllegalArgumentException("La grandezza dei blocchi deve ssere compresa tra 1 e 255.");
    //Padding del messaggio
    int numberToPad=blockSize-msg.length%blockSize;
    byte[] paddedMsg=new byte[msg.length+numberToPad];
    System.arraycopy(msg,0,paddedMsg,0,msg.length);
    for (int i=msg.length;i<paddedMsg.length;i++)
    paddedMsg[i]=(byte)numberToPad;

    return paddedMsg;
    }//pad

    private static byte[][] block(byte[] msg,int blockSize) {
    //Crea un array di bytes 2D sottoposto alla tecnica del padding
    int numberOfBlocks=msg.length/blockSize;
    byte[][] ba=new byte[numberOfBlocks][blockSize];
    for (int i=0;i<numberOfBlocks;i++)
    for (int j=0;j<blockSize;j++)
    ba[i][j]=msg[i*blockSize+j];

    return ba;
    }//block

    private static byte[] unBlock(byte[][] ba,int blockSize) {

    //Crea un array byte[], dove memorizzare il codice decrifrato
    byte[] m2=new byte[ba.length*blockSize];
    //Pone i blocchi in un array 1D
    for (int i=0;i<ba.length;i++) {
    int j=blockSize-1;
    int k=ba[i].length-1;
    while (k>=0) {
    m2[i*blockSize+j]=ba[i][k];
    k--;
    j--;
    }//while
    }//for

    return m2;
    }//unBlock

    private static byte[] unPad(byte[] msg,int blockSize) {
    /*Determina la quantità di blocchi, testando il valore memorizzato
    nell'ultimo blocco*/
    int numberOfPads=(msg[msg.length-1]+256)%256;
    //Elimina i blocchi di padding
    byte[] answer=new byte[msg.length-numberOfPads];
    System.arraycopy(msg,0,answer,0,answer.length);
    return answer;
    }//unPad

    public static byte[] RSAEncipher(byte[] msg,BigInteger e,BigInteger n) {

    //Determina la grandezza in blocchi del testo in chiaro
    int blockSize=(n.bitLength()-1)/8;
    byte[][] ba=block(pad(msg,blockSize),blockSize);
    //Avvia il processo di crittazione
    for (int i=0;i<ba.length;i++)
    ba[i]=getBytes(new BigInteger(1,ba[i]).modPow(e,n));

    //il blocco cifrato è di una dimensione maggiore di byte rispetto al testo in chiaro.
    return unBlock(ba,blockSize+1);
    }//RSAEncipher

    public static byte[] RSADecipher(byte[] msg,BigInteger d,BigInteger n) {

    //Calcola la grandezza del blocchi criptati
    int blockSize=(n.bitLength()-1)/8+1;
    byte[][] ba=block(msg,blockSize);
    //Avvia la decrittazione
    for (int i=0;i<ba.length;i++)
    ba[i]=getBytes(new BigInteger(1,ba[i]).modPow(d,n));

    //spacchetta il testo
    return unPad(unBlock(ba,blockSize-1),blockSize-1);
    }//RSADecipher
    }

    Il codice è stato leggermente modificato da quello di Wikipedia (inserite le ultime due librerie): comunque gli ultimi errori sono sul getBytes(...). Perché???
    Ecco il link del codice Java di Wikipedia per vedere meglio: http://it.wikipedia.org/wiki/RSA
    Vi ringrazio in anticipo!!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Codice RSA di Java

    Originariamente inviato da Power Dragon
    in questo ultimo periodo mi sono interessato alla crittografia/decrittografia, un argomento molto importante della sicurezza informatica. Così mi sono documentato sulla RSA e ho trovato un codice bellino in Java. L'ho guardato e tentato di compilarlo ma mi dava una lista di errori che non capisco...
    Premetto subito che non sono praticissimo (tantomeno "esperto") di crittografia. Innanzitutto non ho guardato bene il codice (nota: dovresti postarlo tra i tag CODE ... altrimenti è illeggibile!) e non ti so dire cosa non va.

    Se davvero ti interessa la crittografia in Java, nel senso di usarla (non di sviluppare tu algoritmi ... non credo proprio ...) allora dovresti orientarti sulla JCA (Java Cryptography Architecture), vedi qui.

    Cioè, detto in altre parole, non usare implementazioni "sfuse" prese da siti vari ... insomma, usa le API standard.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ti ringrazio moltissimo!!!! E' un articolo molto ben strutturato su questo argomento. Al momento avevo mi ero interessato alla costruzione del sistema RSA e seguendo l'esempio di Wikipedia ne volevo ripercorre le tappe... L'algoritmo in sè è giusto ma proprio non riesco a capire gli errori (sono 2) riferiti ai "getBytes(...)" in fondo al codice... E' questo che non riesco a comprendere: eppure sempra essere esatto!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Codice RSA di Java

    Originariamente inviato da Power Dragon
    comunque gli ultimi errori sono sul getBytes(...). Perché???
    Quel getBytes() non è invocato su un qualche oggetto e nemmeno (se fosse statico) usando un nome di un altra classe.

    Quindi per come è stato invocato (ba[i]=getBytes(new BigInteger.......), il getBytes() dovrebbe essere definito e implementato in questa stessa classe RSA. Ma io .... non vedo tale implementazione!! Pertanto non so se il codice è proprio sbagliato o se solo incompleto o se presuppone l'utilizzo di altre classi o altro ancora ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ma il getBytes(...) non è un comando incluso già nel motore Java, cioè nelle librerie native di Java? Sono un po' perplesso...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Power Dragon
    Ma il getBytes(...) non è un comando incluso già nel motore Java, cioè nelle librerie native di Java? Sono un po' perplesso...
    Ma lo vedi come è stato invocato??? Semplicemente getBytes(...). Non: oggetto.getBytes() (se fosse "di istanza") oppure: AltraClasse.getBytes() (se fosse "di classe").
    Quindi questo getBytes() deve essere per forza "in scope" dentro la classe RSA. Questa RSA estende implicitamente Object .... getBytes() non è certo in Object .... e non lo vedo nemmeno in RSA..

    Secondo me questa classe RSA è o sbagliata oppure incompleta .... vedi un po' tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.