Java CipherOutputStream正在创建0字节文件
我正在尝试使用CipherOutputStream编写加密文件 用于序列化的代码Java CipherOutputStream正在创建0字节文件,java,encryption,Java,Encryption,我正在尝试使用CipherOutputStream编写加密文件 用于序列化的代码 public class SerializeDemo implements Serializable{ private static final long serialVersionUID = -7128734972070518012L; private static SerializeDemo INSTANCE = null; private ArrayList <Serial
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");
}
}
如果我在这个类中添加2个以上的字符串成员变量,序列化将停止,并且我将得到一个0字节的文件。请建议RSA不是一种分组密码,并且不会像您期望的那样使用
CipherOutputStream
工作。CipherOutputStream
上的close
方法正在屏蔽一个IllegalBlockSizeException
,该异常是由于数据长于块大小(keysize/8-padding)而引发的
如果在关闭之前调用
c.doFinal()
,您将看到异常。RSA不是分组密码,并且不会像您预期的那样使用CipherOutputStream
工作。CipherOutputStream
上的close
方法正在屏蔽一个IllegalBlockSizeException
,该异常是由于数据长于块大小(keysize/8-padding)而引发的
如果在关闭之前调用
c.doFinal()
,您将看到异常。即使没有写入对象,甚至没有CipherOutputStream
,也不可能使用此代码获取零长度文件,除非出现异常。那是什么?注意:静态<代码>实例代码>的要点让我无法理解。运行代码时没有错误,如果我只给出2个字段,那么我会得到一个非零长度的文件。静态实例用于实现单例模式。您发布的代码中只有两个字段。我们应该理解没有发布非工作版本吗?我已经发布了工作bean,但是如果add让我们说private String V3=null;并尝试加密代码,我们将得到一个0字节的文件,这让人难以置信。实际上不可能。再次查看是否存在异常,以及您是否真的在运行您认为正在运行的代码。即使没有写入对象,甚至没有CipherOutputStream
,也不可能使用此代码获取零长度文件,除非存在异常。那是什么?注意:静态<代码>实例代码>的要点让我无法理解。运行代码时没有错误,如果我只给出2个字段,那么我会得到一个非零长度的文件。静态实例用于实现单例模式。您发布的代码中只有两个字段。我们应该理解没有发布非工作版本吗?我已经发布了工作bean,但是如果add让我们说private String V3=null;并尝试加密代码,我们将得到一个0字节的文件,这让人难以置信。实际上不可能。再次查看是否存在异常,以及您是否真的在运行您认为正在运行的代码。
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
}