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!!!!![]()

Rispondi quotando
