2

我正在尝试以编程方式在计算机上创建 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: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 -远程桌面连接-身份验证-faq.aspx

4

4 回答 4

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();   
}  
于 2012-04-04T20:54:01.650 回答
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());
于 2013-06-13T09:04:53.850 回答
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";
        }
    }
于 2013-09-27T08:16:37.747 回答
0

我今天才找到解决这个问题的方法。只是因为windows(c++)和java之间的区别就错了。我可以加密密码并将其自动填充到 rdpfile 中,然后登录远程桌面而无需再次填写密码。

于 2012-08-16T02:39:02.013 回答