gpt4 book ai didi

c# - 编码/解码 RealVNC 密码

转载 作者:行者123 更新时间:2023-11-30 22:34:22 25 4
gpt4 key购买 nike

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

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

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

我知道 VNC key :

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

因此使用上面的 key 并传递“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();
}

并解密:

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;

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

关于c# - 编码/解码 RealVNC 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com