@@ -13,10 +13,6 @@ namespace Shadowsocks.Encryption | |||||
static EncryptorFactory() | static EncryptorFactory() | ||||
{ | { | ||||
_registeredEncryptors = new Dictionary<string, Type>(); | _registeredEncryptors = new Dictionary<string, Type>(); | ||||
foreach (string method in TableEncryptor.SupportedCiphers()) | |||||
{ | |||||
_registeredEncryptors.Add(method, typeof(TableEncryptor)); | |||||
} | |||||
foreach (string method in PolarSSLEncryptor.SupportedCiphers()) | foreach (string method in PolarSSLEncryptor.SupportedCiphers()) | ||||
{ | { | ||||
_registeredEncryptors.Add(method, typeof(PolarSSLEncryptor)); | _registeredEncryptors.Add(method, typeof(PolarSSLEncryptor)); | ||||
@@ -31,7 +27,7 @@ namespace Shadowsocks.Encryption | |||||
{ | { | ||||
if (string.IsNullOrEmpty(method)) | if (string.IsNullOrEmpty(method)) | ||||
{ | { | ||||
method = "table"; | |||||
method = "aes-256-cfb"; | |||||
} | } | ||||
method = method.ToLowerInvariant(); | method = method.ToLowerInvariant(); | ||||
Type t = _registeredEncryptors[method]; | Type t = _registeredEncryptors[method]; | ||||
@@ -26,7 +26,6 @@ namespace Shadowsocks.Encryption | |||||
{"aes-128-cfb", new int[]{16, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, | {"aes-128-cfb", new int[]{16, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, | ||||
{"aes-192-cfb", new int[]{24, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, | {"aes-192-cfb", new int[]{24, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, | ||||
{"aes-256-cfb", new int[]{32, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, | {"aes-256-cfb", new int[]{32, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, | ||||
{"rc4", new int[]{16, 0, CIPHER_RC4, PolarSSL.ARC4_CTX_SIZE}}, | |||||
{"rc4-md5", new int[]{16, 16, CIPHER_RC4, PolarSSL.ARC4_CTX_SIZE}}, | {"rc4-md5", new int[]{16, 16, CIPHER_RC4, PolarSSL.ARC4_CTX_SIZE}}, | ||||
}; | }; | ||||
@@ -1,106 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
namespace Shadowsocks.Encryption | |||||
{ | |||||
public class TableEncryptor | |||||
: EncryptorBase | |||||
{ | |||||
public TableEncryptor(string method, string password, bool onetimeauth, bool isudp) | |||||
: base(method, password, onetimeauth, isudp) | |||||
{ | |||||
byte[] hash = GetPasswordHash(); | |||||
// TODO endian | |||||
ulong 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 static List<string> SupportedCiphers() | |||||
{ | |||||
return new List<string>(new string[]{"table"}); | |||||
} | |||||
public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | |||||
{ | |||||
byte[] result = new byte[length]; | |||||
for (int i = 0; i < length; i++) | |||||
{ | |||||
outbuf[i] = _encryptTable[buf[i]]; | |||||
} | |||||
outlength = length; | |||||
} | |||||
public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | |||||
{ | |||||
byte[] result = new byte[length]; | |||||
for (int i = 0; i < length; i++) | |||||
{ | |||||
outbuf[i] = _decryptTable[buf[i]]; | |||||
} | |||||
outlength = length; | |||||
} | |||||
private readonly byte[] _encryptTable = new byte[256]; | |||||
private readonly byte[] _decryptTable = new byte[256]; | |||||
private static long Compare(byte x, byte y, ulong a, int i) | |||||
{ | |||||
return (long)(a % (ulong)(x + i)) - (long)(a % (ulong)(y + i)); | |||||
} | |||||
private byte[] MergeSort(byte[] array, ulong a, int j) | |||||
{ | |||||
if (array.Length == 1) | |||||
{ | |||||
return array; | |||||
} | |||||
int middle = array.Length / 2; | |||||
byte[] left = new byte[middle]; | |||||
for (int i = 0; i < middle; i++) | |||||
{ | |||||
left[i] = array[i]; | |||||
} | |||||
byte[] right = new byte[array.Length - middle]; | |||||
for (int i = 0; i < array.Length - middle; i++) | |||||
{ | |||||
right[i] = array[i + middle]; | |||||
} | |||||
left = MergeSort(left, a, j); | |||||
right = MergeSort(right, a, j); | |||||
int leftptr = 0; | |||||
int rightptr = 0; | |||||
byte[] sorted = new byte[array.Length]; | |||||
for (int k = 0; k < array.Length; k++) | |||||
{ | |||||
if (rightptr == right.Length || ((leftptr < left.Length) && (Compare(left[leftptr], right[rightptr], a, j) <= 0))) | |||||
{ | |||||
sorted[k] = left[leftptr]; | |||||
leftptr++; | |||||
} | |||||
else if (leftptr == left.Length || ((rightptr < right.Length) && (Compare(right[rightptr], left[leftptr], a, j)) <= 0)) | |||||
{ | |||||
sorted[k] = right[rightptr]; | |||||
rightptr++; | |||||
} | |||||
} | |||||
return sorted; | |||||
} | |||||
public override void Dispose() | |||||
{ | |||||
} | |||||
} | |||||
} |
@@ -198,14 +198,12 @@ | |||||
this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; | this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; | ||||
this.EncryptionSelect.ItemHeight = 12; | this.EncryptionSelect.ItemHeight = 12; | ||||
this.EncryptionSelect.Items.AddRange(new object[] { | this.EncryptionSelect.Items.AddRange(new object[] { | ||||
"table", | |||||
"rc4-md5", | "rc4-md5", | ||||
"salsa20", | "salsa20", | ||||
"chacha20", | "chacha20", | ||||
"aes-256-cfb", | "aes-256-cfb", | ||||
"aes-192-cfb", | "aes-192-cfb", | ||||
"aes-128-cfb", | |||||
"rc4"}); | |||||
"aes-128-cfb"}); | |||||
this.EncryptionSelect.Location = new System.Drawing.Point(83, 87); | this.EncryptionSelect.Location = new System.Drawing.Point(83, 87); | ||||
this.EncryptionSelect.Name = "EncryptionSelect"; | this.EncryptionSelect.Name = "EncryptionSelect"; | ||||
this.EncryptionSelect.Size = new System.Drawing.Size(160, 20); | this.EncryptionSelect.Size = new System.Drawing.Size(160, 20); | ||||
@@ -188,7 +188,6 @@ | |||||
<Compile Include="Encryption\PolarSSLEncryptor.cs" /> | <Compile Include="Encryption\PolarSSLEncryptor.cs" /> | ||||
<Compile Include="Encryption\Sodium.cs" /> | <Compile Include="Encryption\Sodium.cs" /> | ||||
<Compile Include="Encryption\SodiumEncryptor.cs" /> | <Compile Include="Encryption\SodiumEncryptor.cs" /> | ||||
<Compile Include="Encryption\TableEncryptor.cs" /> | |||||
<Compile Include="Encryption\IEncryptor.cs" /> | <Compile Include="Encryption\IEncryptor.cs" /> | ||||
<Compile Include="Controller\Service\PACServer.cs" /> | <Compile Include="Controller\Service\PACServer.cs" /> | ||||
<Compile Include="Model\LogViewerConfig.cs" /> | <Compile Include="Model\LogViewerConfig.cs" /> | ||||