C# 编码/解码RealVNC密码
我正在尝试编写一个C#应用程序,可以远程更改另一个框上的RealVNC密码 目前有效的方法是,我可以从已经更改的框中提取密码,将其存储为十六进制字符串,然后将其发送到另一个框中,然后以这种方式更改密码,但我需要能够更改密码或动态随机化密码 我在创建要放入注册表的正确二进制文件时遇到问题 我知道VNC密钥: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
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;