Client-server communication The base scenario goes as follows: A program stores some user's confidential data encrypted on their disk. The user is most probably clueless and the disk might get stolen, but these are the classical problems.

Now there's a requirement to allow a sort of remote access without increasing the risk too much. The program gets split into a server and a client parts, each running on a different computer (both belonging to the user). The client part gets the password from the user and the server part gets the encrypted data from the disk. None of the parts is capable of authenticating itself to the other one, as both operate in a possibly compromised environment (so any secret stored in the program is void, but let's assume that the user can enter their password without being snooped).

The server part could send the encrypted data to anyone asking for them, but in comparison to the base scenario, it allows a remote attacker to obtain these data and let their cracking farm work on them. I wonder if there's a better protocol?
If your environment was fully compromised you could at no point actually decrypt your data, defeating the purpose. So I’m going to assume the user only uses an authentic client and the client’s memory is protected during execution.

Generate a private/public keypair. Store the public key on the server, encrypt the private key with the user’s passphrase and store it (encrypted) on the client.
Now the client can authenticate itself against the server without storing any secret between executions.