使用 RSA Bouncy Castle 加密/解密无法正常工作

Posted

技术标签:

【中文标题】使用 RSA Bouncy Castle 加密/解密无法正常工作【英文标题】:Encrypting/decrypting with RSA Bouncy Castle not working properly 【发布时间】: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”初始化加密输入。加密和解密,看看你是否能找回你的名字。同样,您可以取出加密和解密部分,看看文件是否被正确写入和读取。分而治之。 该代码甚至无法编译。 【参考方案1】:

RSAEngine 不添加填充,因此您将丢失数据块中的任何前导零。您还需要使用其中一种可用的编码模式。

我建议也使用对称密钥算法,并且只使用 RSA 来加密对称密钥。它会更快,并且取决于您的数据,也更安全。

问候,

大卫

【讨论】:

【参考方案2】:

我认为您需要更改此行:

   if(nBytesReaded>1)

到这里

   if(nBytesReaded>-1)

并在 decypt 部分更改它,也许:

rsaEngine.init(false,clave);

到这里

rsaEngine.init(false,key);

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

【讨论】:

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

以上是关于使用 RSA Bouncy Castle 加密/解密无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bouncy Castle 将 RSA 公钥转换为 RFC 4716 公钥

从 Bouncy Castle 中的文本创建 RSA 公钥的问题

如何使用Bouncy Castle Crypto API来加密和解密数据

在 C# 中使用 Bouncy Castle 加密/解密

如何使用Bouncy Castle解密AES / CCM加密密文?

无法将 PBEWithHmacSHA1AndDESede 与 Bouncy Castle fips jar 一起使用,可与 RSA cryptoJ 一起使用