java - 创建一个加密的 voip 应用程序
问题描述
我实现了一个使用 AES 和 RC4 算法加密的 voip 应用程序,然后当我执行应用程序并使用两种算法加密语音时,它可以正常工作,但是当我添加算法 ECC 时,它第一次可以工作,并且在它显示此错误之后那么这些算法在这里都不起作用是我的一些执行语音传输并使用 ECC 加密的代码
public VOIPClientEC(String ip, int port) {
this.ip = ip;
this.port = port;
try {
client = new Socket(ip, port);
this.start();
} catch (Exception e) {
}
}
public VOIPClientEC(Socket s) {
client = s;
this.start();
}
public void run() {
try {
//long t = System.currentTimeMillis();
OutputStream o = client.getOutputStream();
DataOutputStream dos = new DataOutputStream(o);
//dos.writeLong(t);
InputStream inp = client.getInputStream();
DataInputStream dis = new DataInputStream(inp);
// long time = dis.readLong();
EllipticCurveAlgorithm algorithm = new EllipticCurveAlgorithm();
PointProccessor processor = new PointProccessor();
long pri = 1234567891;
Point pub = processor.multiply(pri, algorithm.base);
ObjectOutputStream os = new ObjectOutputStream(o);
os.writeObject(pub.getX());
os.writeObject(pub.getY());
ObjectInputStream ois = new ObjectInputStream(inp);
Object px = ois.readObject();
System.out.println(px);
Object py = ois.readObject();
System.out.println(py);
Point p = new Point((long)px, (long)py);
inp = null;
dos = null;
dis = null;
class VOIPEcouteur extends Thread {
private BufferedInputStream buffis = null;
private InputStream is = null;
private byte[] data;
private int count,
cE;
private AudioFormat audio = null;
private SourceDataLine ligneSource = null;
private AudioInputStream audiois = null;
public VOIPEcouteur() {
try {
buffis = new BufferedInputStream(client.getInputStream());
//configuration Audio
audio = confAudio();
} catch (IOException ex) {
}
}
public void run() {
data = new byte[VOIP_BUFFER];
try {
while ((count = buffis.read(data, 0, data.length)) !=
-1 && !boolStopTalking) {
is = new ByteArrayInputStream(data);
audiois = new AudioInputStream(is, audio,
data.length / audio.getFrameSize());
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audio);
ligneSource = (SourceDataLine) AudioSystem.getLine(
dataLineInfo);
ligneSource.open(audio);
ligneSource.start();
while ((count = audiois.read(data, 0, data.length)) !=
-1) {
if (count > 0) {
byte[] s = algorithm.decrypt(data, pri);
ligneSource.write(s, 0, s.length);
cE++;
/* if (cE == 1){
tc3 = System.currentTimeMillis()-time;
System.out.println("temp d'execution EC : "+tc3);
}*/
}
}
}
// ligneSource.flush();
ligneSource.drain();
ligneSource.stop();
ligneSource.close();
client.close();
} catch (IOException | LineUnavailableException ex) {
}
}
}
class VOIPParleur extends Thread {
private BufferedOutputStream buffos = null;
private TargetDataLine ligneCible = null;
private AudioFormat audio = null;
private byte[] data;
private int count;
public VOIPParleur() {
try {
buffos = new BufferedOutputStream(client.
getOutputStream());
audio = confAudio();
} catch (IOException ex) {
}
}
public void run() {
try {
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audio);
ligneCible = (TargetDataLine) AudioSystem.getLine(
dataLineInfo);
ligneCible.open(audio);
ligneCible.start();
data = new byte[VOIP_BUFFER];
boolStopTalking = false;
try {
while (!boolStopTalking) {
count = ligneCible.read(data, 0, data.length);
if (count > 0) {
byte [] s = algorithm.encrypt(data, p);
buffos.write(s, 0, data.length);
}
}
buffos.close();
ligneCible.stop();
ligneCible.close();
client.close();
} catch (Exception e) {
}
} catch (LineUnavailableException ex) {
Logger.getLogger(VOIPClientEC.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
new VOIPParleur().start();
new VOIPEcouteur().start();
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(VOIPClientEC.class.getName()).log(Level.SEVERE, null, ex);
}
}
private AudioFormat confAudio() {
//configuration copi�e
//8000,11025,16000,22050,44100
float sampleRate = 8000.0F;
//8,16
int sampleSizeInBits = 16;
//1,2
int channels = 2;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(sampleRate, sampleSizeInBits,
channels, signed,
bigEndian);
}
}
这就是错误
chat.VOIPClientEC$1VOIPParleur run GRAVE: null javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 8000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian 不支持。在 com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513) 在 com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121) 在 com.sun.media.sound.AbstractDataLine .open(AbstractDataLine.java:153) at chat.VOIPClientEC$1VOIPParleur.run(VOIPClient.java:759)
chat.VOIPClientEC$1VOIPEcouteur.run(VOIPClient.java:720) 线程“Thread-15”java.lang.NullPointerException 中的异常
解决方案
推荐阅读
- oracle - 在 Oracle SQL 中,我想调用一个 Oracle 存储过程,然后选择一个 OUT 参数的值作为列结果。这可能吗?
- c - 本机 ESP-IDF 组件的 ESP32“没有这样的文件或目录”
- javascript - 使用 HTML/JS 和 CSS 单击另一个按钮时打开一列按钮?
- php - 如何在 XAMPP PHP7.4 服务器中复制 magic_quotes 功能?
- android - 用视图绑定替换 kotlin 合成后应用程序被强制关闭
- flutter - 在 Flutter 应用程序图标未显示在 android 设备中
- c# - 如何模拟 Azure.Storage.Blobs.BlobContainerClient?
- github - How to fix 401 Unauthorized Private Github Package
- c++ - 有没有更好的方法将此函数提供给构造函数?
- python - 我在 Django 中创建了 models.UniqueConstraint 但在数据库中没有找到索引并且没有错误