クライアントがテキスト ファイルを読み取り、CipherOutputStream を使用してサーバー ソケットに送信するクライアント/サーバー プログラムを作成しようとしています。予期されるテキスト ファイルが作成されますが、空であり、次のエラーが表示されます
長さ-1を読む
EOF:ヌル
暗号化を行い、データを送信するこのメソッドencrypt()があります
private static void encrypt(InputStream is, OutputStream os) {
try {
byte[] buf = new byte[1024];
// このストリームのバイトは最初にエンコードされます
os = new CipherOutputStream(os, ecipher);
// クリア テキストを読み取り、out に書き込み、暗号化します
int numRead = 0;
while ((numRead = is.read(buf)) >= 0) {
os.write(buf, 0, numRead);
}
// すべてのストリームを閉じます
os.close();
} catch (IOException e) {
System.out.println("I/O Error:" + e.getMessage());
}
}
以下は、クライアント側のほとんどのコードです
public void actionPerformed(ActionEvent e) {
//Handle open button action.
if (e.getSource() == openButton) {
int returnVal = fc.showOpenDialog(FileChooserDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
try {
SecretKey key = KeyGenerator.getInstance("DES").generateKey();
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
File file = fc.getSelectedFile();
Socket s = null;
s = new Socket("localhost", 6880);
DataOutputStream output = new DataOutputStream(s.getOutputStream());
encrypt(new FileInputStream(file), output);
log.append("encrypted " + newline);
log.append("Sent" + file.getName() + "." + newline);
} catch (Exception ex) {
Logger.getLogger(FileChooserDemo.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
log.append("Open command cancelled by user." + newline);
}
log.setCaretPosition(log.getDocument().getLength());
//Handle save button action.
} else if (e.getSource() == saveButton) {
int returnVal = fc.showSaveDialog(FileChooserDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
//This is where a real application would save the file.
log.append("Saving: " + file.getName() + "." + newline);
} else {
log.append("Save command cancelled by user." + newline);
}
log.setCaretPosition(log.getDocument().getLength());
}
}
次に、リスニング サーバーは CipherInputStream を使用してデータを読み取り、それをテキスト ファイルに書き込みます。サーバーには以下が含まれます
private static void decrypt(InputStream is, OutputStream os) {
try {
byte[] buf = new byte[1024];
// ストリームから読み取られたバイトは復号化されます
CipherInputStream cis = new CipherInputStream(is, dcipher);
// 復号化されたバイトを読み取り、クリア テキストを out に書き込みます
int numRead = 0;
while ((numRead = cis.read(buf)) >= 0) {
os.write(buf, 0, numRead);
}
// すべてのストリームを閉じます
cis.close();
is.close();
os.close();
} catch (IOException e) {
System.out.println("I/O Error:" + e.getMessage());
}
}
public void run() {
try {
SecretKey key = KeyGenerator.getInstance("DES").generateKey();
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
decrypt(input, new FileOutputStream("cleartext-reversed.txt"));
FileWriter out = new FileWriter("test.txt");
BufferedWriter bufWriter = new BufferedWriter(out);
System.out.println("receive from : "
+ clientSocket.getInetAddress() + ":"
+ clientSocket.getPort());
//Step 1 read length
int nb = input.read();
System.out.println("Read Length" + nb);
String enctext = Character.toString(input.readChar());
Integer.toString(nb);
//Step 2 read byte
String st = new String("see if it can write");
bufWriter.append(enctext);
bufWriter.close();
//Step 1 send length
output.writeInt(st.length());
//Step 2 send length
output.writeBytes(st); // UTF is a string encoding
// output.writeUTF(data);
} catch (NoSuchPaddingException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidAlgorithmParameterException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
} catch (EOFException e) {
System.out.println("EOF:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO:" + e.getMessage());
} finally {
try {
clientSocket.close();
} catch (IOException e) {/*close failed*/
}
}
}