В настоящее время я использую SharpSSH, который является бесплатным и имеет очень приятный простой интерфейс. Исходная страница SharpSSH. Он имеет все функции аутентификации, о которых вы упомянули.
Вы можете сделать это на C #:
var sftp = new Sftp(hostName, userName, password);
sftp.Connect(port);
sftp.Put(putFilePath, toDir);
sftp.Get(getFilePath);