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
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas tout à fait de votre code, mais il n'est pas cryptographique sécurisé à essayer de transformer un algorithme de chiffrement par bloc avec une largeur fixe de la taille du bloc dans un bloc de chiffrement qui peut travailler sur un flux en juste à fractionner l'entrée en blocs et le cryptage de chacun d'eux. Si vous faites cela, vous faites une glorifié monoalphabetic chiffrement de substitution où chaque "personnage" est un bloc de large. Cela permet à un attaquant de récupérer les pièces de la structure de votre entrée, qui ruine la garantie, il est normalement obtenir à partir de ces primitives cryptographiques. Comme un exemple, voir cet Wikipedia discussion de ce mode particulier de chiffrement et de voir comment il crypte Tux le Pingouin Linux. Le chiffrés image vous permet de voir la structure de l'entrée.
Si vous souhaitez utiliser un algorithme de chiffrement par bloc comme ElGamal pour chiffrer un flux de texte, vous devez utiliser une construction plus complexe comme cipher block chaining (CBC) ou en mode compteur (CTR), qui sont sensiblement cryptographique sécurisé sur les intrants de taille raisonnable. Un attaquant aurait beaucoup de mal à essayer de casser votre sécurité si vous avez utilisé l'un de ces modes.
Je m'excuse de ne pas avoir quelque chose de plus substantiel à dire à propos de votre code, mais honnêtement, je pense que ça vaut le coup de la sauvegarde et de la cueillette une forte crypto système avant d'essayer de débogage. Sinon vous vous retrouverez avec un système de un savant attaquant de papier d'aluminium.
OriginalL'auteur templatetypedef
J'ai enfin la solution, de toute façon je vais juste le mettre ici au cas où quelqu'un aussi eu le même problème avec moi. Tout ce que vous avez à faire est de remplacer
dans encryptDecryptFile(..) méthode avec
depuis ElGamal avec 512 taille de clé de produit 128b lors du chiffrement 50b. J'espère que c'est assez clair.
OriginalL'auteur celax