Java – 无法在RDP文件中encryptionWindows远程桌面密码

我正在尝试以编程方式在计算机上创buildRDP文件。 我正在从一个PROPERTIES文件中获取用户名和密码,并尝试使用CryptProtectData()将其encryption为vlaid格式。 然后生成stringpassword 51:b:<encrypted password>并将其存储在.RDP文件中。

当我查看RDP文件时,得到类似于以下内容的输出: password 51:b:[B@3fd83fd8

看这里: http : //www.remkoweijnen.nl/blog/2007/10/18/how-rdp-passwords-are-encrypted/你可以看到,密码的格式不正确。

顺便说一句,为了做encryption,我正在使用导入: 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)); 

我会很感激任何能够帮助我正确encryption密码的人。

谢谢。

PS,我正在使用Windows XP

编辑:我发现这个信息encryption使用C / C + +,我看着wincrypt.h但我couldnt识别有用的东西: http : //blogs.msdn.com/b/rds/archive/2007/01/22/vista -remote桌面连接authentication,faq.aspx

通过查看你的链接,似乎你错过了将字节数组(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(); } 
  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()); 

这是我的工作解决方案(你需要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"; } } 

我刚刚找到了一种方法来解决这个问题yestoday.It只是因为Windows(c + +)和java的区别。 我可以加密密码并自动填充到rdp文件中,然后在远程桌面登录而不需要重新填写密码。