Comment crypter/décrypter des fichiers texte à l'aide de ElGamal

Je suis en train de chiffrer et déchiffrer des fichiers texte à l'aide ElGamal pour mon étude, mais il semble que je ne pouvais pas le faire fonctionner correctement.
J'ai un groupe de fichiers de texte allant de 1 ko - 1 mo, et je suis en utilisant 512bit pour ma taille de la clé. Je sais déjà que, tout comme RSA, ELGamal ne peut pas chiffrer les valeurs plus que son module de sorte que ma solution initiale, j'ai décidé de diviser chaque fichier en morceaux(qui est plus petit que son module) pour moi d'être en mesure de les chiffrer, et heureusement ces solution fonctionne pour le chiffrement. Mon problème est le suivant,quand j'ai essayé de le déchiffrer, de sorties a été généré n'est pas la sortie réelle je m'attends à voir. Je ne sais pas quelle est la cause de mon problème et j'ai vraiment besoin de trouver une solution dans quelques jours.

Je vais vous montrer quelques-uns de mes extraits de code juste pour rendre les choses claires.

J'avais généré ma paire de clés avec le suivant

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ElGamal", "BC";
keyGen.initialize(512);

Je chiffrer en appelant

public static void encryptFile(String srcFileName, String destFileName, PublicKey key) throws Exception
{
    encryptDecryptFile(srcFileName,destFileName, key, Cipher.ENCRYPT_MODE);
}

et j'décrypter en appelant

public static void decryptFile(String srcFileName, String destFileName, PrivateKey key) throws Exception
{
    encryptDecryptFile(srcFileName,destFileName, key, Cipher.DECRYPT_MODE);
}

Voici la définition de l'encryptDecryptFile(..) la méthode

public static void encryptDecryptFile(String srcFileName, String destFileName, Key key, int cipherMode) throws Exception
{
OutputStream outputWriter = null;
InputStream inputReader = null;
try
{
Cipher cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"");
String textLine = null;
//buffer(my chunks) depends wether it is encyption or decryption
byte[] buf = (cipherMode == Cipher.ENCRYPT_MODE? new byte[50] : new byte[64]);
int bufl;
//init the Cipher object for Encryption...
cipher.init(cipherMode, key);
//start FileIO
outputWriter = new FileOutputStream(destFileName);
inputReader = new FileInputStream(srcFileName);
while ( (bufl = inputReader.read(buf)) != -1)
{
byte[] encText = null;
if (cipherMode == Cipher.ENCRYPT_MODE)
{
encText = encrypt(copyBytes(buf,bufl),(PublicKey)key);
}
else
{
if (_log.isDebugEnabled())
{
System.out.println("buf = " + new String(buf));
}
encText = decrypt(copyBytes(buf,bufl),(PrivateKey)key);
}
outputWriter.write(encText);
if (_log.isDebugEnabled())
{
System.out.println("encText = " + new String(encText));
}
}
outputWriter.flush();
}
catch (Exception e)
{
_log.error(e,e);
throw e;
}
finally
{
try
{
if (outputWriter != null)
{
outputWriter.close();
}
if (inputReader != null)
{
inputReader.close();
}
}
catch (Exception e)
{
//do nothing...
} //end of inner try, catch (Exception)...
}
}

Pour copyBytes:

public static byte[] copyBytes(byte[] arr, int length)
{
byte[] newArr = null;
if (arr.length == length)
{
newArr = arr;
}
else
{
newArr = new byte[length];
for (int i = 0; i < length; i++)
{
newArr[i] = (byte) arr[i];
}
}
return newArr;
}

Pour encypt(...)

    public static byte[] encrypt(byte[] text, PublicKey key) throws Exception
{
byte[] cipherText = null;
try
{
Cipher cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"");
if (_log.isDebugEnabled())
{
_log.debug("\nProvider is: " + cipher.getProvider().getInfo());
_log.debug("\nStart encryption with public key");
}
//encrypt the plaintext using the public key
cipher.init(Cipher.ENCRYPT_MODE, key);
cipherText = cipher.doFinal(text);
}
catch (Exception e)
{
_log.error(e, e);
throw e;
}
return cipherText;
}

et déchiffrer(..)

   public static byte[] decrypt(byte[] text, PrivateKey key) throws Exception
{
byte[] dectyptedText = null;
try
{
//decrypt the text using the private key
Cipher cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"");
cipher.init(Cipher.DECRYPT_MODE, key);
dectyptedText = cipher.doFinal(text);
}
catch (Exception e)
{
_log.error(e, e);
throw e;
}
return dectyptedText;
}

Code Original par Aviran Mondo

Je pense que c'est tout ce dont vous avez besoin, dites-moi si vous voulez voir le code source complet.
Merci,

OriginalL'auteur celax | 2011-02-04