Note that there are some explanatory texts on larger screens.

plurals
  1. POSending a Password via TCP in C#
    primarykey
    data
    text
    <p>I'm and out of practice programmer, so basically new to it again. </p> <p>What I am doing is logging onto a a device over Telnet or TCP. Instead of controlling the device by type command I am using a custom forms application to send the type string commands by pre programmed push button. The device is an old Codec. The purpose of my software is to create a push button controller to be used from a PC. </p> <p>The problem I am having is that some of my devices are password protected and some are not (different firmware). This cannot be changed. The Password protection is what has me stuck.</p> <p>I am sending data to the device using ASCII</p> <pre><code>public void Write(string cmd) { if (!tcpSocket.Connected) return; byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF")); tcpSocket.GetStream().Write(buf, 0, buf.Length); </code></pre> <p>I have been searching on MD5 and have become stuck. I have tried sending the password by plain text typing the password into a text box and initiating the write command. I have also tried sending the output of this code I found on the internet</p> <pre><code>public string EncodePassword(string originalPassword) { //Declarations Byte[] originalBytes; Byte[] encodedBytes; MD5 md5; //Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash (encoded password) md5 = new MD5CryptoServiceProvider(); originalBytes = ASCIIEncoding.Default.GetBytes(originalPassword); encodedBytes = md5.ComputeHash(originalBytes); //Convert encoded bytes back to a 'readable' string return BitConverter.ToString(encodedBytes); </code></pre> <p>I even found another MD5 line that forced upper and lower case. I don't know if it wont work because it is still sending the encoded password in ASCII or what. </p> <p>I do know that my password is right because I can load telnet in windows and log on fine there. Any help in getting this client to authenticate with the server would be most appreciated. </p> <hr> <p>Forgive the length. Since I am unable to reply I had to edit. I think that I was confused on the MD5... After reading the replies I think my problem is the ASCII. I need plain text.</p> <p>Ok, so this is where my beginner stripes shine brightly. This is my first attempt at programming that involves a network of any sort (if it wasn't already that obvious). From reading the replies I think my first problem is the ASCII. I assumed that being sent though that was plain text. Given that when I connect to a server with the same client that does not require password login... The ASCII works just fine. </p> <p>So if I am to use plain text, then How would I go about sending in plain text and not a byte conversion? Assuming that my assumption that ASCII was the way to send plain text is wrong...Which I now think that it is.</p> <p>I have added more code to help this along.</p> <p>When using the Windows telnet client, the device prompts for password and when you type it into telnet no text is shown until after login. After login all typing is shown immediately. </p> <p>The Class used for the socket is mostly a code I found on google with some small tweeks.</p> <pre><code>using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace STC_Control { enum Verbs { WILL = 251, WONT = 252, DO = 253, DONT = 254, IAC = 255 } enum Options { SGA = 3 } class TelnetConnection { TcpClient tcpSocket; int TimeOutMs = 100; public TelnetConnection(string Hostname, int Port) { tcpSocket = new TcpClient(Hostname, Port); } public void WriteLine(string cmd) { Write(cmd + "\n"); } public void Write(string cmd) { if (!tcpSocket.Connected) return; byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF")); tcpSocket.GetStream().Write(buf, 0, buf.Length); } public string Read() { if (!tcpSocket.Connected) return null; StringBuilder sb = new StringBuilder(); do { ParseTelnet(sb); System.Threading.Thread.Sleep(TimeOutMs); } while (tcpSocket.Available &gt; 0); return sb.ToString(); } public bool IsConnected { get { return tcpSocket.Connected; } } void ParseTelnet(StringBuilder sb) { while (tcpSocket.Available &gt; 0) { int input = tcpSocket.GetStream().ReadByte(); switch (input) { case -1: break; case (int)Verbs.IAC: // interpret as command int inputverb = tcpSocket.GetStream().ReadByte(); if (inputverb == -1) break; switch (inputverb) { case (int)Verbs.IAC: //literal IAC = 255 escaped, so append char 255 to string sb.Append(inputverb); break; case (int)Verbs.DO: case (int)Verbs.DONT: case (int)Verbs.WILL: case (int)Verbs.WONT: // reply to all commands with "WONT", unless it is SGA (suppres go ahead) int inputoption = tcpSocket.GetStream().ReadByte(); if (inputoption == -1) break; tcpSocket.GetStream().WriteByte((byte)Verbs.IAC); if (inputoption == (int)Options.SGA) tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL : (byte)Verbs.DO); else tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT); tcpSocket.GetStream().WriteByte((byte)inputoption); break; default: break; } break; default: sb.Append((char)input); break; } } } } } </code></pre> <p>Then the program</p> <pre><code>public Form1() { InitializeComponent(); } //declorations TelnetConnection tc; Int16 vl = 13; private void connect_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(roomBox.Text)) { MessageBox.Show("Please enter a selection before continuing"); } else { { try { //Connects to the server tc = new TelnetConnection(roomBox.Text, 23); //Enables controls panelAll.Enabled = true; } catch { MessageBox.Show("Server Unreachable. "); panelAll.Enabled = false; cState.Text = "Disconnected"; } } } // Button to send login password Temp created to test login public void p_Click(object sender, EventArgs e) { try { //sends text to server tc.WriteLine("PASSWORD"); //enables Buttons panelAll.Enabled = true; //displays return to textbox to verify login or disconnect rx.Text = (tc.Read()); } catch { panelAll.Enabled = false; MessageBox.Show("Communication with device was lost."); cState.Text = "Disconnected"; } } </code></pre> <h2>------------------------------------------------------------------------------------------</h2>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload