【发布时间】:2013-02-20 14:22:25
【问题描述】:
我正在尝试在充气城堡使用 RSAEngine 库进行加密/解密,密钥长度为 2048 位。我能够创建密钥,存储在不同的文件中并从文件中获取,但是当我解密图像时,它会产生一些我不知道解密的文件没有正确显示的东西。文件创建正确,我认为问题出在 processBlock 方法,同时加密和/或解密。加密的代码如下:
InputStream clearTextFile;
FileOutputStream textFileProcessed=new FileOutputStream(fileName);
//getKey is a method I implemented and works correctly
RSAKeyParameters key=getKey(keyFileName);
RSAEngine rsaEngine=new RSAEngine();
rsaEngine.init(true,key);
clearTextFile=new FileInputStream(nameClearTextFile);
byte[] bytesReaded;
int nBytesReaded;
int inputBlockSize=rsaEngine.getInputBlockSize();
do
{
bytesReaded = new byte[inputBlockSize];
nBytesReaded=clearTextFile.read(bytesReaded);
if(nBytesReaded>-1)
{ //This is for the last block if it's not 256 byte length
if(nBytesReaded<inputBlockSize)
{
byte[] temp=new byte[nBytesReaded];
for(int i=0;i<nBytesReaded;i++)
{
temp[i]=bytesReaded[i];
}
byte[] encryptedText=rsaEngine.processBlock(temp,0,nBytesReaded);
textFileProcessed.write(encryptedText);
}
else
{
byte[] encryptedText=rsaEngine.processBlock(bytesReaded,0,inputBlockSize);
textFileProcessed.write(encryptedText);
}
}
}while(nBytesReaded>-1);
textFileProcessed.flush();
textFileProcessed.close();
textFileProcessed.close();
并解密:
InputStream encryptedTextFile=new FileInputStream(nameOfFile);
OutputStream decryptedTextFile=new FileOutputStream(nameOfFile);
RSAKeyParameters key=getKey(nameKeyFile);
RSAEngine rsaEngine=new RSAEngine();
rsaEngine.init(false,key);
byte[] bytesReaded;
int nBytesReaded;
int inputBlockSize=rsaEngine.getInputBlockSize();
do
{
bytesLeidos = new byte[inputBlockSize];
nBytesReaded=encryptedTextFile.read(bytesReaded);
if(nBytesReaded>-1)
{
byte[] decryptedText=rsaEngine.processBlock(bytesReaded,0,inputBlockSize);
decryptedTextFile.write(decryptedText);
}
}while(nBytesReaded>-1);
decryptedTextFile.flush();
decryptedTextFile.close();
encryptedTextFile.close();
提前致谢
【问题讨论】:
-
请简化您的代码以删除所有文件读/写。如果问题是加密或 IO 工作,这将有助于隔离。尝试创建SSCCE - 这对我们很有帮助,也是为自己解决问题的好方法。
-
问题是我认为错误在于加密或解密,错误可能在于保存文件中的字节或从那里读取。我不知道它是这样的,但是它可能正在保存有关数据的信息,这才是真正的问题
-
我建议简化的原因是发现问题所在。删除 IO 操作,您将确定您的加密是否有问题。如果不是,那么它可能是 IO 操作。这是一个基本的调试原则。
-
所以用字节流替换文件流。使用“Javier”初始化加密输入。加密和解密,看看你是否能找回你的名字。同样,您可以取出加密和解密部分,看看文件是否被正确写入和读取。分而治之。
-
该代码甚至无法编译。
标签: java encryption rsa bouncycastle