У меня много очень маленьких данных (19 байт), которые необходимо зашифровать и отправить на удаленный сервер через tcp в зашифрованном формате.Я использую код ниже, чтобы сделать это.
package aesclient;
import java.io.OutputStream;
import java.net.Socket;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESClient {
static byte[] plaintext = new byte[] {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53};
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 1337); // connecting to server on localhost
OutputStream outputStream = socket.getOutputStream();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
String s_key = "Random09" + "Random09"; // 16 Byte = 128 Bit Key
byte[] b_key = s_key.getBytes();
SecretKeySpec sKeySpec = new SecretKeySpec(b_key, "AES");
SecureRandom random = SecureRandom.getInstanceStrong();
byte[] IV = new byte[16]; // initialization vector
int num = 10000;
long start = System.nanoTime();
for (int i = 0; i < num; ++i) {
random.nextBytes(IV);
IvParameterSpec ivSpec = new IvParameterSpec(IV);
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, ivSpec);
byte[] msg = new byte[16 + 32];
System.arraycopy(IV, 0, msg, 0, IV.length);
byte[] encrypted = cipher.doFinal(plaintext);
System.arraycopy(encrypted, 0, msg, IV.length, encrypted.length);
outputStream.write(msg);
outputStream.flush();
}
long end = System.nanoTime();
long duration = end - start;
double drate = ((double)plaintext.length*(double)num)/((double)duration/1000000000);
System.out.println("Verschlüsselung:\n" + num + " mal 19 Bytes in " + ((double)duration/1000000000) + " s\nData Rate = " + drate/1000.0 + " kBytes/s");
}
catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
Мне интересно, почему это очень медленно.Я получаю вывод, подобный этому:
Verschlüsselung:
10000 mal 19 Bytes in 2.566016627 s
Data Rate = 74.04472675694785 kBytes/s
, что означает, что у меня скорость передачи данных 74 кБайт / с исходных (незашифрованных) данных.Скорость передачи данных незначительно возрастает, если я пропускаю отправку по TCP (тогда она составляет около 100 КБ / с).Я читал о скорости передачи данных, которая составляет около 20 МБ / с или даже выше.У меня ноутбук с Windows 10 и процессором i5.Буду благодарен за любую помощь.Как я уже сказал, мне просто нужно передать много небольших пакетов данных (19 байт) в зашифрованном виде.