2010-05-15 11 views
1

Je joue avec le système de chiffrement El Gamal, et mon but est de pouvoir chiffrer et déchiffrer de longues séquences de texte.Pourquoi mon implémentation d'ElGamal ne fonctionne-t-elle pas pour les longues chaînes de texte?

El Gamal exige que le texte en clair soit un nombre entier. J'ai transformé ma chaîne en octets [] en utilisant la méthode .getBytes() pour Strings, puis j'ai créé un BigInteger à partir de l'octet []. Après le cryptage/décryptage, je transforme le BigInteger en un octet [] en utilisant la méthode .toByteArray() pour BigIntegers, puis crée un nouvel objet String à partir de l'octet []. J'utilise une clé de 1035 bits, et cela fonctionne parfaitement lorsque je code/déchiffrer avec des chaînes de 129 caractères maximum. Avec 130 caractères ou plus, la sortie produite à partir de ma méthode de déchiffrement est tronquée.

Quelqu'un peut-il suggérer comment résoudre ce problème?

+0

Pouvez-vous donner un harnais de test pour moi de jouer avec? Exemple d'appel de ces méthodes? – polygenelubricants

+0

J'ai corrigé un peu le code et ajouté une méthode principale qui illustre le problème. Merci pour l'aide! – angstrom91

Répondre

6

Tout comme dans RSA, vous ne pouvez pas crypter une valeur plus grande que le module dans ElGamal.

+1

+1. C'est correct. @ angstrom91: vous devriez vraiment prendre le temps d'essayer de comprendre les algorithmes que vous implémentez. Alors vous ne rencontrerez pas ce genre de problèmes.Vous devrez séparer la chaîne et encoder chaque morceau. – back2dos

+0

Ah oui, il est logique que UTF- * 8 * prenne 8 bits pour encoder, pas 4! D'où la limite de 129 caractères, pas 258 comme je m'y attendais! – angstrom91

0

Vous pouvez

BigInteger pText = new BigInteger(plaintext.getBytes("UTF-8")); 

pour faire le codage/décodage et chiffrement/déchiffrement plus symétrique, mais je ne suis pas sûr que ce soit la cause. Par ailleurs, vous ne devriez jamais consommer silencieusement un Exception. Le moins que vous puissiez faire est juste catch (UnsupportedEncodingException e).

+0

L'encodage UTF est quelque chose que j'avais essayé de faire pour résoudre le problème. Mon bug est arrivé avant cela. J'ai modifié mon code pour refléter mon problème original. – angstrom91

+0

@angst: merci pour le 'main()', j'étais capable de jouer avec, mais je ne pouvais pas comprendre ce qui n'allait pas, désolé. – polygenelubricants

0

Vous devez utiliser des nombres positifs pour vos opérations. Donc, vous devez construire BigInteger comme ceci,

BigInteger pText = new BigInteger(1, plaintext.getBytes()); 
// 1: select a random integer k such that 1 <= k <= p-2 
BigInteger k = abs(new BigInteger(p.bitLength() - 2, sr)); 
+0

Ah, merci pour le conseil. Cela n'a pas résolu mon problème, mais au moins je peux décider de cette cause. – angstrom91

+0

@angst: en fait, le constructeur s'assure que c'est déjà positif. – polygenelubricants

0

Si vous souhaitez chiffrer certaines données avec l'algorithme cryptographique asymétrique, vous pouvez le faire uniquement pour le bloc de données très court. Les raisons sont à la fois «techniques» (l'algorithme fonctionne de cette façon) et «pratiques» (la cryptographie asymétrique est lente).

La bonne façon de chiffrer le grand bloc de données en utilisant l'algorithme cryptographique asymétrique est

  1. aléatoire générer (« session ») clé pour un algorithme symétrique (AES, RC4, 3DES, vous nommez).
  2. utiliser cet algorithme pour chiffrer les données
  3. utiliser votre algorithme asymétrique pour chiffrer la clé de session
  4. magasin la clé chiffrée près des données.
  5. arrêt réinventer la roue