为什么我的ElGamal实现不适用于长文本字符串?

时间:2010-05-15 03:01:54

标签: java cryptography biginteger elgamal

我正在玩El Gamal密码系统,我的目标是能够加密和破译长文本序列。

El Gamal要求明文为整数。我已经使用字符串的.getBytes()方法将我的字符串转换为byte [],然后在byte []中创建了一个BigInteger。在加密/解密之后,我使用BigIntegers的.toByteArray()方法将BigInteger转换为byte [],然后从byte []创建一个新的String对象。

我正在使用1035位密钥,当我使用最多129个字符的字符串加密/解密时,这非常有效。对于130个或更多字符,我的解密方法产生的输出是乱码。

有人可以建议如何解决这个问题吗?

4 个答案:

答案 0 :(得分:6)

就像在RSA中一样,你不能加密大于ElGamal模数的值。

答案 1 :(得分:0)

你可以尝试

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

使编码/解码和加密/解密更加对称,但我不确定这是否是根本原因。

顺便说一句,你不应该默默地使用Exception。你至少可以做的只是catch (UnsupportedEncodingException e)

答案 2 :(得分:0)

您需要为您的操作使用正数。所以你必须像这样构建BigInteger,

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 :(得分:0)

如果要使用非对称加密算法加密某些数据,则只能对非常短的数据块执行此操作。原因是“技术”(算法以这种方式工作)和“实用”(非对称加密是)。

使用非对称加密算法加密大块数据的正确方法是

  1. 为某些对称算法(AES,RC4,3DES,您命名)生成随机(“会话”)键。
  2. 使用此算法加密数据
  3. 使用您的非对称算法加密会话密钥
  4. 将加密密钥存储在数据附近。
  5. 停止重新发明轮子