我正在尝试以编程方式在计算机上创建RDP文件。
我从一个PROPERTIES文件中获取用户名和密码,并尝试使用CryptProtectData()
将其加密为vlaid格式。然后我生成字符串password 51:b:<encrypted password>
并将其存储在.RDP文件中。
当我查看RDP文件时,输出类似于以下内容:
password 51:b:[B@3fd83fd8
在这里查看:http://www.remkoweijnen.nl/blog/2007/10/18/how-rdp-passwords-are-encrypted/ 你可以看到密码的格式不正确。
顺便说一句,为了进行加密,我使用导入:import com.sun.jna.platform.win32.Crypt32Util;
来访问Crypt32Util.cryptProtectData(passwordBytes)
,如以下代码所示:
FileWriter fstream = new FileWriter(rdpFile);
BufferedWriter out = new BufferedWriter(fstream);
out.write("full address:s:"+remoteServerIP);
out.write("\nusername:s:"+username);
byte[] passwordBytes = password.getBytes();
out.write("\npassword 51:b:"+Crypt32Util.cryptProtectData(passwordBytes));
我很感激能帮我正确加密密码的人。
谢谢。
PS,我正在使用Windows XP
编辑:我发现这个关于使用C / C ++进行加密的信息,我查看了wincrypt.h,但我找不到任何有用的信息:http://blogs.msdn.com/b/rds/archive/2007/01/22/vista-remote-desktop-connection-authentication-faq.aspx答案 0 :(得分:2)
通过查看您的链接,您似乎错过了将字节数组(将CryptUtil应用于密码的结果)转换为十六进制字符串表示的步骤:
out.write("\npassword 51:b:"+ ToHexString(Crypt32Util.cryptProtectData(passwordBytes)));
其中ToHexString(byte [] barray):String看起来像这样:
public static String ToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
for (byte b : bytes) {
formatter.format("%02x", b);
}
return sb.toString();
}
答案 1 :(得分:1)
String paasword ="pwd";
DATA_BLOB pDataIn = new DATA_BLOB(password.getBytes(Charset.forName("UTF-16LE")));
DATA_BLOB pDataEncrypted = new DATA_BLOB();
System.out.println(Crypt32.INSTANCE.CryptProtectData(pDataIn, "psw",
null, null, null, WinCrypt.CRYPTPROTECT_UI_FORBIDDEN, pDataEncrypted));
StringBuffer epwsb = new StringBuffer();
byte[] pwdBytes= new byte [pDataEncrypted.cbData];
pwdBytes=pDataEncrypted.getData();
Formatter formatter = new Formatter(epwsb);
for ( final byte b : pwdBytes ) {
formatter.format("%02X", b);
}
System.out.println("password 51:b:"+ epwsb.toString());
答案 2 :(得分:1)
这是我的工作解决方案(你需要JNA平台才能实现这个目标):
private static String ToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
for (byte b : bytes) {
formatter.format("%02x", b);
}
formatter.close();
return sb.toString();
}
private String cryptRdpPassword(String pass) {
try {
return ToHexString(Crypt32Util.cryptProtectData(pass.getBytes("UTF-16LE"), null, 0, "psw", null));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "ERROR";
}
}
答案 3 :(得分:0)
我刚刚找到了解决这个问题的方法。因为windows(c ++)和java之间的差异,这是错误的。 我可以将密码加密并在rdpfile中自动填充,然后登录远程桌面而不再重新填写密码。