Browse Source

Merge pull request #6 from madeye/feature_rc4

Add RC4 encryption support
tags/2.3
clowwindy 11 years ago
parent
commit
613aee5080
8 changed files with 238 additions and 89 deletions
  1. +4
    -1
      shadowsocks-csharp/Config.cs
  2. +47
    -20
      shadowsocks-csharp/Encryptor.cs
  3. +106
    -64
      shadowsocks-csharp/Form1.Designer.cs
  4. +3
    -1
      shadowsocks-csharp/Form1.cs
  5. +6
    -2
      shadowsocks-csharp/Local.cs
  6. +70
    -0
      shadowsocks-csharp/RC4.cs
  7. +1
    -1
      shadowsocks-csharp/Test.cs
  8. +1
    -0
      shadowsocks-csharp/shadowsocks-csharp.csproj

+ 4
- 1
shadowsocks-csharp/Config.cs View File

@@ -14,6 +14,7 @@ namespace shadowsocks_csharp
public int server_port; public int server_port;
public int local_port; public int local_port;
public string password; public string password;
public string method;
public bool isDefault; public bool isDefault;
@@ -49,6 +50,7 @@ namespace shadowsocks_csharp
server_port = 8388, server_port = 8388,
local_port = 1081, local_port = 1081,
password = "barfoo!", password = "barfoo!",
method = "table",
isDefault = true isDefault = true
}; };
} }
@@ -65,7 +67,8 @@ namespace shadowsocks_csharp
server = config.server, server = config.server,
server_port = config.server_port, server_port = config.server_port,
local_port = config.local_port, local_port = config.local_port,
password = config.password
password = config.password,
method = config.method
}); });
sw.Write(jsonString); sw.Write(jsonString);
sw.Flush(); sw.Flush();


+ 47
- 20
shadowsocks-csharp/Encryptor.cs View File

@@ -7,8 +7,13 @@ namespace shadowsocks_csharp
{ {
class Encryptor class Encryptor
{ {
public const int TYPE_TABLE = 1;
public const int TYPE_RC4 = 2;
public byte[] encryptTable = new byte[256]; public byte[] encryptTable = new byte[256];
public byte[] decryptTable = new byte[256]; public byte[] decryptTable = new byte[256];
public int method = TYPE_TABLE;
public RC4 rc4 = null;
private long compare(byte x, byte y, ulong a, int i) private long compare(byte x, byte y, ulong a, int i)
{ {
@@ -53,43 +58,65 @@ namespace shadowsocks_csharp
return sorted; return sorted;
} }
public Encryptor(string password)
public Encryptor(string method, string password)
{ {
MD5 md5 = System.Security.Cryptography.MD5.Create(); MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(password); byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(password);
byte[] hash = md5.ComputeHash(inputBytes); byte[] hash = md5.ComputeHash(inputBytes);
// TODO endian
var a = BitConverter.ToUInt64(hash, 0);
for (int i = 0; i < 256; i++)
{
encryptTable[i] = (byte)i;
}
for (int i = 1; i < 1024; i++)
{
encryptTable = mergeSort(encryptTable, a, i);
}
for (int i = 0; i < 256; i++)
{
decryptTable[encryptTable[i]] = (byte)i;
if (method != null && method.ToLowerInvariant().Equals("rc4")) {
Console.WriteLine("init rc4");
this.method = TYPE_RC4;
rc4 = new RC4();
encryptTable = rc4.EncryptInitalize(hash);
decryptTable = rc4.EncryptInitalize(hash);
} else {
Console.WriteLine("init table");
this.method = TYPE_TABLE;
// TODO endian
var a = BitConverter.ToUInt64(hash, 0);
for (int i = 0; i < 256; i++)
{
encryptTable[i] = (byte)i;
}
for (int i = 1; i < 1024; i++)
{
encryptTable = mergeSort(encryptTable, a, i);
}
for (int i = 0; i < 256; i++)
{
decryptTable[encryptTable[i]] = (byte)i;
}
} }
} }
public void Encrypt(byte[] buf, int length) public void Encrypt(byte[] buf, int length)
{ {
for (int i = 0; i < length; i++)
switch (method)
{ {
buf[i] = encryptTable[buf[i]];
case TYPE_TABLE:
for (int i = 0; i < length; i++)
buf[i] = encryptTable[buf[i]];
break;
case TYPE_RC4:
rc4.Encrypt(encryptTable, buf, length);
break;
} }
} }
public void Decrypt(byte[] buf, int length) public void Decrypt(byte[] buf, int length)
{ {
for (int i = 0; i < length; i++)
switch (method)
{ {
buf[i] = decryptTable[buf[i]];
case TYPE_TABLE:
for (int i = 0; i < length; i++)
buf[i] = decryptTable[buf[i]];
break;
case TYPE_RC4:
rc4.Decrypt(decryptTable, buf, length);
break;
} }
} }
} }
} }

+ 106
- 64
shadowsocks-csharp/Form1.Designer.cs View File

@@ -31,26 +31,29 @@
this.components = new System.ComponentModel.Container(); this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label5 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox(); this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox(); this.textBox2 = new System.Windows.Forms.TextBox();
this.textBox3 = new System.Windows.Forms.TextBox(); this.textBox3 = new System.Windows.Forms.TextBox();
this.textBox4 = new System.Windows.Forms.TextBox(); this.textBox4 = new System.Windows.Forms.TextBox();
this.panel1 = new System.Windows.Forms.Panel();
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.ConfigItem = new System.Windows.Forms.ToolStripMenuItem(); this.ConfigItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.QuitItem = new System.Windows.Forms.ToolStripMenuItem(); this.QuitItem = new System.Windows.Forms.ToolStripMenuItem();
this.panel2 = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel();
this.tableLayoutPanel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout();
this.panel1.SuspendLayout();
this.contextMenuStrip1.SuspendLayout(); this.contextMenuStrip1.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// tableLayoutPanel1 // tableLayoutPanel1
@@ -60,33 +63,44 @@
this.tableLayoutPanel1.ColumnCount = 2; this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.Controls.Add(this.label5, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1); this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.comboBox1, 1, 4);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2); this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.label4, 0, 3); this.tableLayoutPanel1.Controls.Add(this.label4, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.textBox1, 1, 0); this.tableLayoutPanel1.Controls.Add(this.textBox1, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.textBox2, 1, 1); this.tableLayoutPanel1.Controls.Add(this.textBox2, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.textBox3, 1, 2); this.tableLayoutPanel1.Controls.Add(this.textBox3, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.textBox4, 1, 3); this.tableLayoutPanel1.Controls.Add(this.textBox4, 1, 3);
this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);
this.tableLayoutPanel1.Location = new System.Drawing.Point(22, 12);
this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(196, 104);
this.tableLayoutPanel1.Size = new System.Drawing.Size(203, 131);
this.tableLayoutPanel1.TabIndex = 0; this.tableLayoutPanel1.TabIndex = 0;
// //
// label5
//
this.label5.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(12, 110);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(58, 15);
this.label5.TabIndex = 8;
this.label5.Text = "Encryptor";
//
// label1 // label1
// //
this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.label1.AutoSize = true; this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 6);
this.label1.Location = new System.Drawing.Point(14, 5);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(51, 13);
this.label1.Size = new System.Drawing.Size(56, 15);
this.label1.TabIndex = 0; this.label1.TabIndex = 0;
this.label1.Text = "Server IP"; this.label1.Text = "Server IP";
// //
@@ -94,19 +108,33 @@
// //
this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 32);
this.label2.Location = new System.Drawing.Point(3, 31);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(60, 13);
this.label2.Size = new System.Drawing.Size(67, 15);
this.label2.TabIndex = 1; this.label2.TabIndex = 1;
this.label2.Text = "Server Port"; this.label2.Text = "Server Port";
// //
// comboBox1
//
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBox1.FormattingEnabled = true;
this.comboBox1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.comboBox1.ItemHeight = 13;
this.comboBox1.Items.AddRange(new object[] {
"table",
"rc4"});
this.comboBox1.Location = new System.Drawing.Point(76, 107);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(124, 21);
this.comboBox1.TabIndex = 9;
//
// label3 // label3
// //
this.label3.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label3.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.label3.AutoSize = true; this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(10, 58);
this.label3.Location = new System.Drawing.Point(9, 57);
this.label3.Name = "label3"; this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.Size = new System.Drawing.Size(61, 15);
this.label3.TabIndex = 2; this.label3.TabIndex = 2;
this.label3.Text = "Password"; this.label3.Text = "Password";
// //
@@ -114,16 +142,16 @@
// //
this.label4.Anchor = System.Windows.Forms.AnchorStyles.Right; this.label4.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.label4.AutoSize = true; this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(8, 84);
this.label4.Location = new System.Drawing.Point(8, 83);
this.label4.Name = "label4"; this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(55, 13);
this.label4.Size = new System.Drawing.Size(62, 15);
this.label4.TabIndex = 3; this.label4.TabIndex = 3;
this.label4.Text = "Proxy Port"; this.label4.Text = "Proxy Port";
// //
// textBox1 // textBox1
// //
this.textBox1.Anchor = System.Windows.Forms.AnchorStyles.Left; this.textBox1.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.textBox1.Location = new System.Drawing.Point(69, 3);
this.textBox1.Location = new System.Drawing.Point(76, 3);
this.textBox1.Name = "textBox1"; this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(124, 20); this.textBox1.Size = new System.Drawing.Size(124, 20);
this.textBox1.TabIndex = 4; this.textBox1.TabIndex = 4;
@@ -132,7 +160,7 @@
// textBox2 // textBox2
// //
this.textBox2.Anchor = System.Windows.Forms.AnchorStyles.Left; this.textBox2.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.textBox2.Location = new System.Drawing.Point(69, 29);
this.textBox2.Location = new System.Drawing.Point(76, 29);
this.textBox2.Name = "textBox2"; this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(124, 20); this.textBox2.Size = new System.Drawing.Size(124, 20);
this.textBox2.TabIndex = 5; this.textBox2.TabIndex = 5;
@@ -141,7 +169,7 @@
// textBox3 // textBox3
// //
this.textBox3.Anchor = System.Windows.Forms.AnchorStyles.Left; this.textBox3.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.textBox3.Location = new System.Drawing.Point(69, 55);
this.textBox3.Location = new System.Drawing.Point(76, 55);
this.textBox3.Name = "textBox3"; this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(124, 20); this.textBox3.Size = new System.Drawing.Size(124, 20);
this.textBox3.TabIndex = 6; this.textBox3.TabIndex = 6;
@@ -150,46 +178,12 @@
// textBox4 // textBox4
// //
this.textBox4.Anchor = System.Windows.Forms.AnchorStyles.Left; this.textBox4.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.textBox4.Location = new System.Drawing.Point(69, 81);
this.textBox4.Location = new System.Drawing.Point(76, 81);
this.textBox4.Name = "textBox4"; this.textBox4.Name = "textBox4";
this.textBox4.Size = new System.Drawing.Size(124, 20); this.textBox4.Size = new System.Drawing.Size(124, 20);
this.textBox4.TabIndex = 7; this.textBox4.TabIndex = 7;
this.textBox4.WordWrap = false; this.textBox4.WordWrap = false;
// //
// panel1
//
this.panel1.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.panel1.AutoSize = true;
this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel1.Controls.Add(this.button2);
this.panel1.Controls.Add(this.button1);
this.panel1.Location = new System.Drawing.Point(59, 128);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(164, 30);
this.panel1.TabIndex = 1;
//
// button2
//
this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button2.Location = new System.Drawing.Point(86, 4);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "Cancel";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.cancelButton_Click);
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button1.Location = new System.Drawing.Point(4, 4);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "OK";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.OKButton_Click);
//
// notifyIcon1 // notifyIcon1
// //
this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
@@ -207,35 +201,79 @@
this.QuitItem}); this.QuitItem});
this.contextMenuStrip1.Name = "contextMenuStrip1"; this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.contextMenuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
this.contextMenuStrip1.Size = new System.Drawing.Size(111, 76);
this.contextMenuStrip1.Size = new System.Drawing.Size(123, 82);
// //
// ConfigItem // ConfigItem
// //
this.ConfigItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); this.ConfigItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);
this.ConfigItem.Name = "ConfigItem"; this.ConfigItem.Name = "ConfigItem";
this.ConfigItem.Size = new System.Drawing.Size(110, 22);
this.ConfigItem.Size = new System.Drawing.Size(122, 24);
this.ConfigItem.Text = "Config"; this.ConfigItem.Text = "Config";
this.ConfigItem.Click += new System.EventHandler(this.Config_Click); this.ConfigItem.Click += new System.EventHandler(this.Config_Click);
// //
// aboutToolStripMenuItem // aboutToolStripMenuItem
// //
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(110, 22);
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(122, 24);
this.aboutToolStripMenuItem.Text = "About"; this.aboutToolStripMenuItem.Text = "About";
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
// //
// toolStripSeparator2 // toolStripSeparator2
// //
this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(107, 6);
this.toolStripSeparator2.Size = new System.Drawing.Size(119, 6);
// //
// QuitItem // QuitItem
// //
this.QuitItem.Name = "QuitItem"; this.QuitItem.Name = "QuitItem";
this.QuitItem.Size = new System.Drawing.Size(110, 22);
this.QuitItem.Size = new System.Drawing.Size(122, 24);
this.QuitItem.Text = "Quit"; this.QuitItem.Text = "Quit";
this.QuitItem.Click += new System.EventHandler(this.Quit_Click); this.QuitItem.Click += new System.EventHandler(this.Quit_Click);
// //
// panel2
//
this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.panel2.AutoSize = true;
this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel2.Location = new System.Drawing.Point(61, 175);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(0, 0);
this.panel2.TabIndex = 1;
//
// button1
//
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button1.Location = new System.Drawing.Point(4, 4);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "OK";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.OKButton_Click);
//
// button2
//
this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button2.Location = new System.Drawing.Point(86, 4);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "Cancel";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.cancelButton_Click);
//
// panel1
//
this.panel1.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.panel1.AutoSize = true;
this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel1.Controls.Add(this.button2);
this.panel1.Controls.Add(this.button1);
this.panel1.Location = new System.Drawing.Point(61, 153);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(164, 30);
this.panel1.TabIndex = 1;
//
// Form1 // Form1
// //
this.AcceptButton = this.button1; this.AcceptButton = this.button1;
@@ -245,6 +283,7 @@
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.CancelButton = this.button2; this.CancelButton = this.button2;
this.ClientSize = new System.Drawing.Size(282, 206); this.ClientSize = new System.Drawing.Size(282, 206);
this.Controls.Add(this.panel2);
this.Controls.Add(this.tableLayoutPanel1); this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.panel1); this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
@@ -255,8 +294,8 @@
this.Load += new System.EventHandler(this.Form1_Load); this.Load += new System.EventHandler(this.Form1_Load);
this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout(); this.tableLayoutPanel1.PerformLayout();
this.panel1.ResumeLayout(false);
this.contextMenuStrip1.ResumeLayout(false); this.contextMenuStrip1.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@@ -273,15 +312,18 @@
private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3; private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.TextBox textBox4; private System.Windows.Forms.TextBox textBox4;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.NotifyIcon notifyIcon1; private System.Windows.Forms.NotifyIcon notifyIcon1;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem ConfigItem; private System.Windows.Forms.ToolStripMenuItem ConfigItem;
private System.Windows.Forms.ToolStripMenuItem QuitItem; private System.Windows.Forms.ToolStripMenuItem QuitItem;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Panel panel1;
} }
} }

+ 3
- 1
shadowsocks-csharp/Form1.cs View File

@@ -32,6 +32,7 @@ namespace shadowsocks_csharp
textBox2.Text = config.server_port.ToString(); textBox2.Text = config.server_port.ToString();
textBox3.Text = config.password; textBox3.Text = config.password;
textBox4.Text = config.local_port.ToString(); textBox4.Text = config.local_port.ToString();
comboBox1.Text = config.method == null ? "table" : config.method;
} }
private void Form1_Load(object sender, EventArgs e) private void Form1_Load(object sender, EventArgs e)
@@ -77,6 +78,7 @@ namespace shadowsocks_csharp
server_port = int.Parse(textBox2.Text), server_port = int.Parse(textBox2.Text),
password = textBox3.Text, password = textBox3.Text,
local_port = int.Parse(textBox4.Text), local_port = int.Parse(textBox4.Text),
method = comboBox1.Text,
isDefault = false isDefault = false
}; };
Config.Save(config); Config.Save(config);
@@ -102,7 +104,7 @@ namespace shadowsocks_csharp
private void Form1_FormClosed(object sender, FormClosedEventArgs e) private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{ {
local.Stop();
if (local != null) local.Stop();
} }
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) private void aboutToolStripMenuItem_Click(object sender, EventArgs e)


+ 6
- 2
shadowsocks-csharp/Local.cs View File

@@ -16,7 +16,7 @@ namespace shadowsocks_csharp
public Local(Config config) public Local(Config config)
{ {
this.config = config; this.config = config;
this.encryptor = new Encryptor(config.password);
this.encryptor = new Encryptor(config.method, config.password);
} }
public void Start() public void Start()
@@ -62,7 +62,11 @@ namespace shadowsocks_csharp
// Create the state object. // Create the state object.
Handler handler = new Handler(); Handler handler = new Handler();
handler.connection = conn; handler.connection = conn;
handler.encryptor = encryptor;
if (encryptor.method == Encryptor.TYPE_TABLE) {
handler.encryptor = encryptor;
} else {
handler.encryptor = new Encryptor(config.method, config.password);
}
handler.config = config; handler.config = config;
handler.Start(); handler.Start();


+ 70
- 0
shadowsocks-csharp/RC4.cs View File

@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace shadowsocks_csharp
{
public class RC4
{
class Context
{
public int index1 = 0;
public int index2 = 0;
}

private Context enc_ctx = new Context();
private Context dec_ctx = new Context();

public void Encrypt(byte[] table, byte[] data, int length)
{
EncryptOutput(enc_ctx, table, data, length);
}

public void Decrypt(byte[] table, byte[] data, int length)
{
EncryptOutput(dec_ctx, table, data, length);
}

public byte[] EncryptInitalize(byte[] key)
{
byte[] s = new byte[256];

for (int i = 0; i < 256; i++)
{
s[i] = (byte)i;
}

for (int i = 0, j = 0; i < 256; i++)
{
j = (j + key[i % key.Length] + s[i]) & 255;

Swap(s, i, j);
}

return s;
}

private void EncryptOutput(Context ctx, byte[] s, byte[] data, int length)
{
for (int n = 0; n < length; n++)
{
byte b = data[n];

ctx.index1 = (ctx.index1 + 1) & 255;
ctx.index2 = (ctx.index2 + s[ctx.index1]) & 255;

Swap(s, ctx.index1, ctx.index2);

data[n] = (byte)(b ^ s[(s[ctx.index1] + s[ctx.index2]) & 255]);
}
}

private static void Swap(byte[] s, int i, int j)
{
byte c = s[i];

s[i] = s[j];
s[j] = c;
}
}
}

+ 1
- 1
shadowsocks-csharp/Test.cs View File

@@ -12,7 +12,7 @@ namespace shadowsocks_csharp
public static void Test1() public static void Test1()
{ {
Encryptor encryptor = new Encryptor("foobar!");
Encryptor encryptor = new Encryptor("table", "foobar!");
for (int i = 0; i < 256; i++) for (int i = 0; i < 256; i++)
{ {


+ 1
- 0
shadowsocks-csharp/shadowsocks-csharp.csproj View File

@@ -62,6 +62,7 @@
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="RC4.cs" />
<Compile Include="Config.cs" /> <Compile Include="Config.cs" />
<Compile Include="Encryptor.cs" /> <Compile Include="Encryptor.cs" />
<Compile Include="Form1.cs"> <Compile Include="Form1.cs">


Loading…
Cancel
Save