gpt4 book ai didi

java - 如何在另外两种类型的 Streams 中使用 Socket 流 - Java

转载 作者:行者123 更新时间:2023-12-02 13:08:23 25 4
gpt4 key购买 nike

我正在尝试为 Java 实现 Diffie-Hellman 握手。我有一个小问题,Diffie-Hellman 是使用 DataInputStream 和 DataOutputStream 与客户端的 Socket 完成的,但为了使用它返回的 secret ,我需要使用 CipherStream。所以我在套接字上使用 CipherStream 和 DataStream。

public byte[] DHHandshake(Socket s){
byte[] secret = null;
try (DataOutputStream out = new DataOutputStream(s.getOutputStream())){
try(DataInputStream in = new DataInputStream(s.getInputStream())){
//Crear llave pública y privada en el cliente.
KeyPairGenerator kpg = KeyPairGenerator.getInstance(PROTOCOL);
kpg.initialize(Skip.sDHparameterSpec);
KeyPair keyPair = kpg.generateKeyPair();

//Envía llave pública del cliente al servidor
byte[] keyBytes = keyPair.getPublic().getEncoded();
out.writeInt(keyBytes.length);
out.write(keyBytes);

//Recibe llave pública del servidor
keyBytes = new byte[in.readInt()];
in.readFully(keyBytes);
KeyFactory kf = KeyFactory.getInstance(PROTOCOL);
X509EncodedKeySpec x509Spec = new X509EncodedKeySpec(keyBytes);
PublicKey theirPublicKey = kf.generatePublic(x509Spec);

//Llave pública servidor + llave privada cliente = llave compartida.
KeyAgreement ka = KeyAgreement.getInstance(PROTOCOL) ;
ka.init(keyPair.getPrivate());
ka.doPhase(theirPublicKey, true);
secret = ka.generateSecret();
}
}catch(Exception e) {
e.printStackTrace();
}
return secret;
}

try-with-resources 关闭数据流,但也关闭套接字。因此,当我尝试使用 DiffieHellman 中返回的 key 通过 CipherStream 发送文件时,它会抛出一个异常,表示套接字已关闭:

private void receiveFile(Socket s, byte[] secret){
try(FileOutputStream fileWriter = new FileOutputStream(FILE)){
Cipher cipher = Cipher.getInstance(ALGORITHM + "/ECB/PKCS5PADDING");
SecretKeySpec keySpec = new SecretKeySpec(secret, ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
try(CipherInputStream cipherIn = new CipherInputStream(s.getInputStream(), cipher)){
byte[] fileBuffer = new byte[1024];
int len;
while ((len = cipherIn.read(fileBuffer)) >= 0)
fileWriter.write(fileBuffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
//TODO checkMD5
}

这是我的问题:

  • 如果我不关闭DataStream,那么是否可以重新使用SocketStream来发送数据。这不会损坏 SocketStream,因为 DataStream 和 CipherStream 同时使用它吗?

  • 有没有办法在不关闭SocketStream的情况下关闭DataStream?

  • 有没有办法使用 DataStream 初始化 CipherStream?喜欢重复使用它吗?

最佳答案

所有这些问题的简单答案是将密码流包装在相应的数据流周围。

关于java - 如何在另外两种类型的 Streams 中使用 Socket 流 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44052210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com