Why doesn't my implementation of ElGamal work

2019-07-31 18:57发布

I'm playing with the El Gamal cryptosystem, and my goal is to be able to encipher and decipher long sequences of text.

El Gamal requires the plaintext to be an integer. I have turned my string into a byte[] using the .getBytes() method for Strings, and then created a BigInteger out of the byte[]. After encryption/decryption, I turn the BigInteger into a byte[] using the .toByteArray() method for BigIntegers, and then create a new String object from the byte[].

I am using a 1035 bit key, and this works perfectly when I encipher/decipher with strings up to 129 characters. With 130 or more characters, the output produced from my decipher method is garbled.

Can someone suggest how to solve this issue?

4条回答
地球回转人心会变
2楼-- · 2019-07-31 19:29

You need to use positive numbers for your operations. So you must construct BigInteger like this,

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));
查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-07-31 19:44

You can try

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

to make the encoding/decoding and enciphering/deciphering more symmetric, but I'm not sure if that's the root cause.

By the way, you should never silently consume an Exception. The very least you can do is just catch (UnsupportedEncodingException e).

查看更多
时光不老,我们不散
4楼-- · 2019-07-31 19:48

If you want to encrypt certain data with asymmetric cryptographic algorithm, you can do this only for really short data block. The reasons are both "technical" (the algorithm works this way) and "practical" (asymmetric cryptography is slow).

The right way to encrypt the large block of data using asymmetric cryptographic algorithm is

  1. generate random ("session") key for some symmetric algorithm (AES, RC4, 3DES, you name it).
  2. use this algorithm to encrypt the data
  3. use your asymmetric algorithm to encrypt the session key
  4. store the encrypted key near the data.
  5. stop reinventing the wheel
查看更多
时光不老,我们不散
5楼-- · 2019-07-31 19:49

Just like in RSA, you cannot encrypt a value larger than the modulus in ElGamal.

查看更多
登录 后发表回答