Java - 无法加密RDP文件中的Windows远程桌面密码

时间:2012-04-04 19:58:18

标签: java windows remote-desktop password-encryption

我正在尝试以编程方式在计算机上创建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

4 个答案:

答案 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中自动填充,然后登录远程桌面而不再重新填写密码。