C# 编码/解码RealVNC密码

C# 编码/解码RealVNC密码,c#,.net-2.0,des,C#,.net 2.0,Des,我正在尝试编写一个C#应用程序,可以远程更改另一个框上的RealVNC密码 目前有效的方法是,我可以从已经更改的框中提取密码,将其存储为十六进制字符串,然后将其发送到另一个框中,然后以这种方式更改密码,但我需要能够更改密码或动态随机化密码 我在创建要放入注册表的正确二进制文件时遇到问题 我知道VNC密钥: byte[] Key = { 23, 82, 107, 6, 35, 78, 88, 7 }; 因此,使用上述密钥并将“1234”作为密码传递,使用以下代码进行加密: public stat

我正在尝试编写一个C#应用程序,可以远程更改另一个框上的RealVNC密码

目前有效的方法是,我可以从已经更改的框中提取密码,将其存储为十六进制字符串,然后将其发送到另一个框中,然后以这种方式更改密码,但我需要能够更改密码或动态随机化密码

我在创建要放入注册表的正确二进制文件时遇到问题

我知道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,但我没有。以下是我加密/解密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();
    }

不记得我是从哪里得到密码的。我不是原作者。

运气好吗?我已经查看了vncpwdump src代码,显然在使用该键之前对其做了一些操作。我正试图通过openssl复制加密,但到目前为止没有结果。DES似乎在密码上使用反向位排序来加密。。。但我还没有测试过。
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;