gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:42 25 4
gpt4 key购买 nike

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

为了清楚起见,我将向您展示我的一些代码片段。

我用下面的代码生成了我的 key 对

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);
}

这是 encryptDecryptFile(..) 方法的定义

public static void encryptDecryptFile(String srcFileName, String destFileName, Key key, int cipherMode) throws Exception
{
OutputStream outputWriter = null;
InputStream inputReader = null;
try
{
Cipher cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"");
String textLine = null;
//buffer(my chunks) depends wether it is encyption or decryption
byte[] buf = (cipherMode == Cipher.ENCRYPT_MODE? new byte[50] : new byte[64]);
int bufl;
// init the Cipher object for Encryption...
cipher.init(cipherMode, key);

// start FileIO
outputWriter = new FileOutputStream(destFileName);
inputReader = new FileInputStream(srcFileName);
while ( (bufl = inputReader.read(buf)) != -1)
{
byte[] encText = null;
if (cipherMode == Cipher.ENCRYPT_MODE)
{
encText = encrypt(copyBytes(buf,bufl),(PublicKey)key);
}
else
{
if (_log.isDebugEnabled())
{
System.out.println("buf = " + new String(buf));
}
encText = decrypt(copyBytes(buf,bufl),(PrivateKey)key);
}
outputWriter.write(encText);
if (_log.isDebugEnabled())
{
System.out.println("encText = " + new String(encText));
}
}
outputWriter.flush();

}
catch (Exception e)
{
_log.error(e,e);
throw e;
}
finally
{
try
{
if (outputWriter != null)
{
outputWriter.close();
}
if (inputReader != null)
{
inputReader.close();
}
}
catch (Exception e)
{
// do nothing...
} // end of inner try, catch (Exception)...
}
}

对于复制字节:

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;
}

对于加密(...)

    public static byte[] encrypt(byte[] text, PublicKey key) throws Exception
{
byte[] cipherText = null;
try
{

Cipher cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"");
if (_log.isDebugEnabled())
{
_log.debug("\nProvider is: " + cipher.getProvider().getInfo());
_log.debug("\nStart encryption with public key");
}

// encrypt the plaintext using the public key
cipher.init(Cipher.ENCRYPT_MODE, key);
cipherText = cipher.doFinal(text);
}
catch (Exception e)
{
_log.error(e, e);
throw e;
}
return cipherText;
}

和解密(..)

   public static byte[] decrypt(byte[] text, PrivateKey key) throws Exception
{
byte[] dectyptedText = null;
try
{
// decrypt the text using the private key
Cipher cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"");
cipher.init(Cipher.DECRYPT_MODE, key);
dectyptedText = cipher.doFinal(text);
}
catch (Exception e)
{
_log.error(e, e);
throw e;
}
return dectyptedText;

}

Original code by Aviran Mondo

我想这就是您所需要的,如果您想查看完整的源代码,请告诉我。谢谢,

最佳答案

这与您的代码不太相关,但是尝试将具有固定宽度 block 大小的 block 密码转换为可以通过将输入拆分为流来工作的 block 密码在密码学上并不安全 block 并加密它们中的每一个。如果你这样做,你实际上是在做一个美化的单字母替换密码,其中每个“字符”都是一个 block 宽。这允许攻击者恢复您输入的部分结构,这破坏了您通常从这些加密原语中获得的保证。例如,参见 this Wikipedia discussion of this particular mode of encryption看看它是如何加密 Tux the Linux Penguin 的。加密后的图像可以立即让您看到输入的结构。

如果您想使用像 ElGamal 这样的 block 密码来加密文本流,您应该使用更复杂的结构,例如 cipher block chaining (CBC)counter mode (CTR) ,这在合理大小的输入上是可证明的加密安全的。如果您使用其中一种模式,攻击者将很难尝试破坏您的安全。

对于您的代码没有更多内容可说,我深表歉意,但老实说,我认为在尝试调试此代码之前,值得备份并选择一个强大的加密系统。否则,您最终会得到一个聪明的攻击者可以破坏的系统。

关于java - 如何使用 ElGamal 加密/解密文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com