2017-01-10 1 views
0

私はCipherOutputStreamを使用して暗号化されたファイルを記述しようとしています、CipherOutputStreamは、シリアル化のために0バイトのファイル

PFBコードを作成

public class SerializeDemo implements Serializable{ 
    private static final long serialVersionUID = -7128734972070518012L; 

    private static SerializeDemo INSTANCE = null; 

    private ArrayList <SerializeItem> item; 
    public static void serialize() { 
     INSTANCE = new SerializeDemo(); 

     ArrayList <SerializeItem> list = new ArrayList <SerializeItem>(); 

     SerializeItem item = new SerializeItem(); 

     item.setV1("DD"); 
     item.setV2("D"); 
     list.add(item); 

     INSTANCE.setItem(list); 
     try { 
      Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
      c.init(Cipher.ENCRYPT_MODE, getKeyPair().getPublic()); 

      CipherOutputStream cos = new CipherOutputStream(new FileOutputStream("D:\\abc"), c); 
      ObjectOutputStream os = new ObjectOutputStream(cos); 
      os.writeObject(INSTANCE); 
      os.flush(); 
      os.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      } 

     System.out.println("Serialized"); 
    } 
} 

PFB私SerializeItemクラス定義

public class SerializeItem implements Serializable{ 
    private static final long serialVersionUID = 850426811900126363L; 

    private String V1 = null; 

    private String V2 = null; 

//getter setters for the bean file 
} 

私が追加した場合このクラスの直列化における2つ以上のStringメンバー変数が停止し、0バイトのファイルが取得されています。助けて

+1

オブジェクトが記述されていなくても、実際には例外がなければ 'CipherOutputStream'がなくても、このコードでゼロ長のファイルを取得することはできません。それが何だった?静的な 'INSTANCE'のポイントが私を逃げる。 – EJP

+0

コードの実行中にエラーはありません.2フィールドだけを指定すると、ゼロ以外の長さのファイルが取得されます。スタティックインスタンスはシングルトンパターンの実装用です –

+0

投稿したコードには2つのフィールドしかありません。私たちは非稼働バージョンを掲載していないことを理解していますか? – EJP

答えて

1

RSAはブロック暗号ではなく、CipherOutputStreamと期待しているように動作しません。 CipherOutputStreamcloseメソッドは、データがブロックサイズ(keysize/8 - パディング)より長いために発生したIllegalBlockSizeExceptionをマスクしています。

閉じる前にc.doFinal()に電話すると例外が表示されます。

関連する問題