0

次のコードがあります。ただし、ファイルb.xlsxとファイルc.xlsxは 0 バイトです。なぜ機能しないのCipherOuputSteamですか?

public static void main(String[] args) throws Exception {

    KeyPair keys = KeyPairGenerator.getInstance("RSA").generateKeyPair();
    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE, keys.getPublic());

    FileInputStream fis;
    FileOutputStream fos;
    CipherOutputStream  cos;

    fis = new FileInputStream("C:/temp/a.xlsx");
    fos = new FileOutputStream("C:/temp/b.xlsx");

    cos = new CipherOutputStream (fos, cipher);

    byte[] block = new byte[8];
    int i;
    while ((i = fis.read(block)) != -1) {
        cos.write(block, 0, i);
    }
    cos.close();
    fos.close();



    cipher.init(Cipher.DECRYPT_MODE, keys.getPrivate());
    CipherInputStream cis1, cis2;
    fis = new FileInputStream("c:/temp/b.xlsx");
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    fos = new FileOutputStream("c:/temp/c.xlsx");

    while ((i = cis.read(block)) != -1) {
        fos.write(block, 0, i);
    }
    fos.close();
    fis.close();
    cis.close();
}
4

1 に答える 1

3

問題はあなたの使用法にあります - これは正しくなくCipherOutputStream、非常に重要な例外をマスクする実装にあります - IllegalBlockSizeException

問題は、RSA キーを使用して、キーのサイズ (この例では 128 バイト) よりも長いデータを暗号化できないことです。データの大きなブロックには、対称暗号化アルゴリズム ( AESなど) を使用する必要があります。

何らかの理由で非対称キーを使用する場合 (データの安全な送信など) - このSO answerで良い例を見つけることができます。

于 2013-03-18T08:52:29.810 に答える