2011-10-21 19 views
1

別のボックスでRealVNCパスワードをリモートで変更できるC#アプリケーションを作成しようとしています。エンコード/デコードRealVNCパスワード

現在、どのように変更されているボックスからパスワードを引き出し、16進数の文字列として保存し、別のボックスに送信してからパスワードを変更することができますが、パスワードを変更するか、即座にランダム化します。

レジストリに配置する正しいバイナリの作成に問題があります。

私はVNCキーを知っている:

byte[] Key = { 23, 82, 107, 6, 35, 78, 88, 7 }; 

だから、次のコードを使用して暗号化するためのパスワードとして「1234」を上記のキーを使用して渡す:

public static byte[] EncryptTextToMemory(string Data, byte[] Key) 
{ 
    try 
    { 
     MemoryStream mStream = new MemoryStream() 

     DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); 
     desProvider.Mode = CipherMode.ECB; 
     desProvider.Key = Key; 

     CryptoStream cStream = new CryptoStream(mStream, 
      desProvider.CreateEncryptor(), 
      CryptoStreamMode.Write); 

     byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data); 

     cStream.Write(toEncrypt, 0, toEncrypt.Length); 
     cStream.FlushFinalBlock(); 

     byte[] ret = mStream.ToArray(); 

     cStream.Close(); 
     mStream.Close(); 

     return ret; 
    } 
    catch (CryptographicException ex) 
    { 
     MessageBox.Show("A Cryptographic error occurred: " + ex.Message); 
     return null; 
    } 

返されたバイト配列を通過した後BitConverter.ToStringに設定すると、RealVNC自体ですでに1234に設定されているパスワードのレジストリに格納されているのと同じ16進値を取得すると予想されますが、そうではありません。ここで

+0

運がいいですか?私は、vncpwdumpのsrcコードを見て、明らかに何かが使用される前にキーに対して行われています。私はopensslを使って暗号化を再現しようとしていましたが、今のところそれは無駄でした。 – olivervbk

+1

DESは暗号化にパスワードの逆順を使用しているようだ... [link](http://www.vidarholen.net/contents/junk/vnc.html) それをテストしていない。 – olivervbk

答えて

0

は私の情報源は、VNCのパスワードを暗号化/復号化するために、次のとおりです。

public static string EncryptVNC(string password) 
    { 
     if (password.Length > 8) 
     { 
      password = password.Substring(0, 8); 
     } 
     if (password.Length < 8) 
     { 
      password = password.PadRight(8, '\0'); 
     } 

     byte[] key = { 23, 82, 107, 6, 35, 78, 88, 7 }; 
     byte[] passArr = new ASCIIEncoding().GetBytes(password); 
     byte[] response = new byte[passArr.Length]; 
     char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 

     // reverse the byte order 
     byte[] newkey = new byte[8]; 
     for (int i = 0; i < 8; i++) 
     { 
      // revert desKey[i]: 
      newkey[i] = (byte)(
       ((key[i] & 0x01) << 7) | 
       ((key[i] & 0x02) << 5) | 
       ((key[i] & 0x04) << 3) | 
       ((key[i] & 0x08) << 1) | 
       ((key[i] & 0x10) >> 1) | 
       ((key[i] & 0x20) >> 3) | 
       ((key[i] & 0x40) >> 5) | 
       ((key[i] & 0x80) >> 7) 
       ); 
     } 
     key = newkey; 
     // reverse the byte order 

     DES des = new DESCryptoServiceProvider(); 
     des.Padding = PaddingMode.None; 
     des.Mode = CipherMode.ECB; 

     ICryptoTransform enc = des.CreateEncryptor(key, null); 
     enc.TransformBlock(passArr, 0, passArr.Length, response, 0); 

     string hexString = String.Empty; 
     for (int i = 0; i < response.Length; i++) 
     { 
      hexString += chars[response[i] >> 4]; 
      hexString += chars[response[i] & 0xf]; 
     } 
     return hexString.Trim().ToLower(); 
    } 

と復号化に:

public static string DecryptVNC(string password) 
    { 
     if (password.Length < 16) 
     { 
      return string.Empty; 
     } 

     byte[] key = { 23, 82, 107, 6, 35, 78, 88, 7 }; 
     byte[] passArr = ToByteArray(password); 
     byte[] response = new byte[passArr.Length]; 

     // reverse the byte order 
     byte[] newkey = new byte[8]; 
     for (int i = 0; i < 8; i++) 
     { 
      // revert key[i]: 
      newkey[i] = (byte)(
       ((key[i] & 0x01) << 7) | 
       ((key[i] & 0x02) << 5) | 
       ((key[i] & 0x04) << 3) | 
       ((key[i] & 0x08) << 1) | 
       ((key[i] & 0x10) >> 1) | 
       ((key[i] & 0x20) >> 3) | 
       ((key[i] & 0x40) >> 5) | 
       ((key[i] & 0x80) >> 7) 
       ); 
     } 
     key = newkey; 
     // reverse the byte order 

     DES des = new DESCryptoServiceProvider(); 
     des.Padding = PaddingMode.None; 
     des.Mode = CipherMode.ECB; 

     ICryptoTransform dec = des.CreateDecryptor(key, null); 
     dec.TransformBlock(passArr, 0, passArr.Length, response, 0); 

     return System.Text.ASCIIEncoding.ASCII.GetString(response); 
    } 

また、この機能が必要とされている:トップアドオンで

public static byte[] ToByteArray(String HexString) 
    { 
     int NumberChars = HexString.Length; 
     byte[] bytes = new byte[NumberChars/2]; 

     for (int i = 0; i < NumberChars; i += 2) 
     { 
      bytes[i/2] = Convert.ToByte(HexString.Substring(i, 2), 16); 
     } 

     return bytes; 
    } 

を:

using System.Security.Cryptography; 

コードをどこから取得したかわからない。私は元の著者ではない。

関連する問題