1

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

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

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

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

4

4 回答 4

6

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

于 2010-05-15T13:36:18.803 回答
0

你可以试试

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

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

顺便说一句,你永远不应该默默地消费一个Exception. 你至少可以做的是catch (UnsupportedEncodingException e)

于 2010-05-15T03:20:52.687 回答
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));
于 2010-05-15T04:00:18.660 回答
0

如果您想使用非对称加密算法加密某些数据,您只能对非常短的数据块执行此操作。原因既有“技术性”(算法以这种方式工作),也有“实用性”(非对称密码学很)。

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

  1. 为某些对称算法(AES,RC4,3DES,你可以命名)生成随机(“会话”)密钥。
  2. 使用此算法加密数据
  3. 使用您的非对称算法加密会话密钥
  4. 将加密密钥存储在数据附近。
  5. 停止重新发明轮子
于 2010-05-15T15:28:46.953 回答