使用RSA Bouncy Castle进行加密/解密不正常。

4

我正在尝试使用Bouncy Castle的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 - 这对我们很有帮助,也是解决问题的好方法。 - Duncan Jones
问题在于我认为错误出现在加密或解密过程中,错误可能存在于将字节保存到文件中或从文件中读取。我不确定是否是这样,但可能是保存有关数据的信息,这才是真正的问题。 - Javier
2
我建议简化的原因是为了找出问题所在。去掉IO操作,你就可以确定你的加密是否有问题。如果没有问题,那么很可能是IO操作的问题。这是一项基本的调试原则。 - Duncan Jones
所以用字节流替换文件流。使用“Javier”初始化加密输入。加密和解密,看看是否能得到你的名字。同样,您可以删除加密和解密部分,查看文件是否被正确写入和读取。分而治之。 - Lee Meador
那段代码甚至无法编译。 - President James K. Polk
我可以知道在哪里可以找到这方面的例子吗? :) - Roy Lee
2个回答

2
RSAEngine不会添加填充,因此您的数据块中的任何前导零都将丢失。您还需要使用可用的其中一种编码模式。
我建议您同时使用对称密钥算法,并仅使用RSA加密对称密钥。这将更快,并且根据您的数据,也更安全。
敬礼,
大卫

1

我认为你需要更改这一行代码:

   if(nBytesReaded>1)

至此

   if(nBytesReaded>-1)

在解密部分,也许要更改这个:

rsaEngine.init(false,clave);

转换成这个

rsaEngine.init(false,key);

但可能还有更多。如果最后一个块不是完整大小,则您没有加密整个输入。


谢谢。我没有看到第一个。第二个是翻译错误。显然它会获取整个输入,因为在 21KB 文件大小和获取 getInputBlockSize 后,最后一个是 82 字节长度,这就是我创建 temp 的原因。在处理 RSAEngine 后添加填充或类似的东西,如果我没记错的话。虽然我已经修复了错误,但问题仍然存在。 - Javier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接