Java 如何使用ElGamal加密/解密文本文件

Java 如何使用ElGamal加密/解密文本文件,java,elgamal,Java,Elgamal,我正在尝试使用ElGamal对文本文件进行加密和解密,但似乎无法使其正常工作。 我有一组从1kb到1mb的文本文件,我的密钥大小使用512bit。我已经知道,就像RSA一样,ELGamal加密的值不能超过其模数,所以作为我的初始解决方案,我决定将每个文件分成块(小于其模数),以便我能够对其进行加密,幸运的是,这些解决方案可以用于加密。我的问题是,当我试图解密它时,生成的输出并不是我期望看到的实际输出。我不知道我的问题的原因是什么,我真的需要在几天内找到解决办法 我将向您展示我的一些代码片段,只是

我正在尝试使用ElGamal对文本文件进行加密和解密,但似乎无法使其正常工作。 我有一组从1kb到1mb的文本文件,我的密钥大小使用512bit。我已经知道,就像RSA一样,ELGamal加密的值不能超过其模数,所以作为我的初始解决方案,我决定将每个文件分成块(小于其模数),以便我能够对其进行加密,幸运的是,这些解决方案可以用于加密。我的问题是,当我试图解密它时,生成的输出并不是我期望看到的实际输出。我不知道我的问题的原因是什么,我真的需要在几天内找到解决办法

我将向您展示我的一些代码片段,只是为了让您明白

我已经用以下代码生成了我的密钥对

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ElGamal", "BC";
keyGen.initialize(512);
我打电话加密

public static void encryptFile(String srcFileName, String destFileName, PublicKey key) throws Exception
{
    encryptDecryptFile(srcFileName,destFileName, key, Cipher.ENCRYPT_MODE);
}
public static void decryptFile(String srcFileName, String destFileName, PrivateKey key) throws Exception
{
    encryptDecryptFile(srcFileName,destFileName, key, Cipher.DECRYPT_MODE);
}
我打电话解密

public static void encryptFile(String srcFileName, String destFileName, PublicKey key) throws Exception
{
    encryptDecryptFile(srcFileName,destFileName, key, Cipher.ENCRYPT_MODE);
}
public static void decryptFile(String srcFileName, String destFileName, PrivateKey key) throws Exception
{
    encryptDecryptFile(srcFileName,destFileName, key, Cipher.DECRYPT_MODE);
}
下面是encryptDecryptFile(..)方法的定义

对于copyBytes:

public static byte[] copyBytes(byte[] arr, int length)
{
    byte[] newArr = null;
    if (arr.length == length)
    {
        newArr = arr;
    }
    else
    {
        newArr = new byte[length];
        for (int i = 0; i < length; i++)
        {
            newArr[i] = (byte) arr[i];
        }
    }
    return newArr;
}
和解密(…)

原始代码由Aviran Mondo编写

我想这就是你所需要的,只要告诉我你是否想看到完整的源代码。
谢谢,

这与您的代码没有太大关系,但尝试将具有固定宽度块大小的块密码转换为可以在流上工作的块密码在密码学上并不安全,只需将输入拆分为块并对每个块进行加密即可。如果你这样做,你实际上是在做一个美化的单字母替换密码,其中每个“字符”是一个块宽。这允许攻击者恢复输入结构的一部分,从而破坏您通常从这些加密原语获得的保证。举个例子,看看它是如何加密Linux企鹅Tux的。加密图像立即允许您查看输入的结构

如果您想使用像ElGamal这样的分组密码来加密文本流,那么应该使用像or这样更复杂的构造,它在合理大小的输入上具有可证明的加密安全性。如果您使用这些模式之一,攻击者将很难尝试破坏您的安全


很抱歉,对于您的代码,我没有更多实质性的内容要说,但我真诚地认为,在尝试调试这个系统之前,备份并选择一个强大的加密系统是值得的。否则,你最终会得到一个聪明的攻击者可以挫败的系统。

我终于找到了解决方案,无论如何,我会把它放在这里,以防万一有人也和我有同样的问题。你所要做的就是更换

byte[] buf = (cipherMode == Cipher.ENCRYPT_MODE? new byte[50] : new byte[64]);
在encryptDecryptFile(..)方法中,使用

byte[] buf = (cipherMode == Cipher.ENCRYPT_MODE? new byte[50] : new byte[128]);

因为具有512密钥大小的ElGamal在加密50b时产生128b。我希望这足够清楚。

嗨,谢谢你的回答,但我想我必须更具体地说。我非常感谢你给了我这样的提示,但我最关心的不是算法本身的安全性。我研究的重点是输入类型(可能是字母、数字、字母数字符号或四种组合——我使用组合输入类型作为控制)如何影响算法的速度,我的测试算法之一是elgamal。如果有人能给我一个建议,我会很高兴的,再次感谢您的快速响应templatetypedef。
byte[] buf = (cipherMode == Cipher.ENCRYPT_MODE? new byte[50] : new byte[128]);