So side A prints out a value, side B has to input it using the user as the go between.
Hmm...
Isn't there a public key based way to avoid needing the user to do this.
Not that I can think of, no. This is the public key based way of doing things.
I mean the value gets encrypted or signed with a private key.
Not really applicable here. If you want to create an alternative design, I recommend first looking at src/protocol.rs to see what the current design constraints are. (Or the README.md for the overall workflow.)