Hello all!

I had to deploy and configure UltraVnc server to the remote computers. For this purpose it was necessary to write UltraVnc password encryption method.

Passwords stores in   ultravnc.ini

[ultravnc]
passwd=<Encrypted password>
passwd2=< Encrypted password >

passwd - full control password

passwd2 - read-only password

Password must be no more than 8 characters long. Missing characters filled with null characters ('�').  Password is encrypted with DES + 2 symbols at the end of resulting string.

I found Perl implementation, and then write C# implementation.  I have problems with compatibility between Perl and C# DES implementation, but they where successfully solved.

C# implementation of encryption and decryption UltraVnc password:

public static string EncryptPassword(string plainPassword)
{
 DES des = CreateDES();
 ICryptoTransform cryptoTransfrom = des.CreateEncryptor();

 plainPassword = plainPassword + "��������";
 plainPassword = plainPassword.Length > 8 ? plainPassword.Substring(0, 8) : plainPassword;
 byte[] data = Encoding.ASCII.GetBytes(plainPassword);
 byte[] encryptedBytes = cryptoTransfrom.TransformFinalBlock(data, 0, data.Length);

 return ByteArrayToHex(encryptedBytes) + "00";
}

public static string DecryptPassword(string encryptedPassword)
{
 DES des = CreateDES();
 ICryptoTransform cryptoTransfrom = des.CreateDecryptor();
 byte[] data = HexToByteArray(encryptedPassword.Substring(0, encryptedPassword.Length - 2));
 byte[] decryptedBytes = cryptoTransfrom.TransformFinalBlock(data, 0, data.Length);

 return Encoding.ASCII.GetString(decryptedBytes);
 }

private static DES CreateDES()
{
 byte[] key = { 0xE8, 0x4A, 0xD6, 0x60, 0xC4, 0x72, 0x1A, 0xE0 };
 DES des = DES.Create();
 des.Key = key;
 des.IV = key;
 des.Mode = CipherMode.ECB;
 des.Padding = PaddingMode.Zeros;
 return des;
} 
public static string ByteArrayToHex(byte[] bytes)
{
 char[] c = new char[bytes.Length * 2];
 byte b;
 for (int i = 0; i < bytes.Length; i++)
 {
  b = (byte)(bytes[i] >> 4);
  c[i * 2] = (char)(b > 9 ? b + 0x37 : b + 0x30);
  b = (byte)(bytes[i] & 0xF);
  c[(i * 2) + 1] = (char)(b > 9 ? b + 0x37 : b + 0x30);
 }
 return new string(c);
}

public static byte[] HexToByteArray(string hex)
{
 if (hex.Length % 2 == 1)
 {
  throw new Exception("The binary key cannot have an odd number of digits");
 }
 byte[] arr = new byte[hex.Length >> 1];
 for (int i = 0; i < (hex.Length >> 1); ++i)
 {
  arr[i] = (byte)(((hex[i << 1] - (hex[i << 1] < 58 ? 48 : 55)) << 4) + (hex[(i << 1) + 1] - (hex[(i << 1) + 1] < 58 ? 48 : 55)));
 }
 return arr;
}

 Translate: ru