Client-server communication
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.