3

弾力がある城で、2048ビット長のキーを使用してRSAEngineライブラリを使用して暗号化/復号化しようとしています。キーを作成し、別のファイルに保存してファイルから取得することはできますが、画像を復号化すると、復号化されたファイルが正しく表示されないことがわかりません。ファイルは正しく作成され、問題は、暗号化および/または復号化中の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();

前もって感謝します

4

2 に答える 2

1

RSAEngine はパディングを追加しないため、結果としてデータ ブロックの先行ゼロが失われます。利用可能なエンコード モードのいずれかを使用する必要があります。

対称鍵アルゴリズムも使用し、RSA を使用して対称鍵を暗号化することをお勧めします。はるかに高速になり、データによっては安全になります。

よろしく、

デビッド

于 2013-03-07T12:38:53.763 に答える
0

この行を変更する必要があると思います:

   if(nBytesReaded>1)

これに

   if(nBytesReaded>-1)

そして、decypt 部分でこれを変更します。

rsaEngine.init(false,clave);

これに

rsaEngine.init(false,key);

しかし、もっとあるかもしれません。最後のブロックがフルサイズでない場合、入力全体を暗号化していません。

于 2013-03-06T00:08:33.733 に答える