我正在玩El Gamal密码系统,我的目标是能够加密和破译长文本序列。
El Gamal要求明文为整数。我已经使用字符串的.getBytes()方法将我的字符串转换为byte [],然后在byte []中创建了一个BigInteger。在加密/解密之后,我使用BigIntegers的.toByteArray()方法将BigInteger转换为byte [],然后从byte []创建一个新的String对象。
我正在使用1035位密钥,当我使用最多129个字符的字符串加密/解密时,这非常有效。对于130个或更多字符,我的解密方法产生的输出是乱码。
有人可以建议如何解决这个问题吗?
答案 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)
如果要使用非对称加密算法加密某些数据,则只能对非常短的数据块执行此操作。原因是“技术”(算法以这种方式工作)和“实用”(非对称加密是慢)。
使用非对称加密算法加密大块数据的正确方法是