クライアントからサーバー に暗号化されたファイルを送信するコードを書いていますが、クライアントはまずファイルの暗号化されたメッセージダイジェストをサーバーに送信してから、それは、暗号化されたファイルの をバイトを送信します終了しますが、サーバー側でそれがダイジェストで一つの変数、InputStreamから別の入力を読み込むJAVA
として、これらすべての変数を読み込むと、サーバが解読しようとしたとき、それはここIllegal Block Size Exception
私の質問を投げているダイジェストどのようにサーバーがさまざまな変数でそれらを読み込んで保存できますか?
クライアント
// set mode to encrypt
AesCipher.init(Cipher.ENCRYPT_MODE, key);
DataOutputStream toServer = new DataOutputStream(socket.getOutputStream());
// get the digest of the file
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(bytes);
// encrypt digest and write it to file
byte [] encryptedHash = AesCipher.doFinal(hash);
toServer.write(encryptedHash);
// write file name to server
toServer.writeUTF(fileName);
//encrypt file
byte[] encryptedByte = AesCipher.doFinal(bytes);
// write file to server
toServer.write(encryptedByte);
toServer.flush();
socket.close();
サーバー
// read digest of the file
byte [] digest =IOUtils.toByteArray(fromClient);
// decrypt it
AesCipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedDigest = AesCipher.doFinal(digest);
// read file name to be received
String fileName = fromClient.readUTF();
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
// read file bytes from client
byte[] fileBytes = IOUtils.toByteArray(fromClient);
AesCipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedByte = AesCipher.doFinal(fileBytes);
bos.write(decryptedByte, 0, decryptedByte.length);
bos.close();
も私はこのコードを試してみましたが、それはありませんが、あまりにも
// read digest of the file
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = fromClient.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] digest = buffer.toByteArray();
// decrypt it
AesCipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedDigest = AesCipher.doFinal(digest);
// read file name to be received
String fileName = fromClient.readUTF();
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
// read file bytes from client
byte[] fileBytes = IOUtils.toByteArray(fromClient);
AesCipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedByte = AesCipher.doFinal(fileBytes);
bos.write(decryptedByte, 0, decryptedByte.length);
bos.close();
サーバー側では、各ピースごとに書き出されたバイト数と同じバイト数で読み込むのではなく、 'digest'に書き込まれた量全体を読み込みます。片方が16バイトの場合は、16バイトで読み込む必要があります。それ以前に何バイトかが分からなければ、ピースの長さにピース自体の前に接頭辞を付ける必要があります。 –
@JamesKPolkどのようにすることができます=私はダイジェストを暗号化した後に何バイトを知っていますか? – Inspiration
あなたはそれよりも先にその長さを送る必要があります。 – EJP