【问题标题】:How to encrypt RDP password in Java如何在 Java 中加密 RDP 密码
【发布时间】:2012-08-17 01:46:19
【问题描述】:

我想生成具有自动登录功能的rdp文件,所以需要生成加密密码并填写rdp文件。

对于加密工具,我使用的是 jna 开源的 Crypt32Util(我也尝试过 DPAPI DataProtector,结果是一样的)。但是结果不正确……

正如http://www.remkoweijnen.nl/blog/2007/10/18/how-rdp-passwords-are-encrypted/ 所指出的,字符串应该是unicode,这就是我在getBytes 中使用'UTF-16LE' 的原因(我也尝试过使用getBytes() 和getBytes("UTF-8"),没有人工作...)

非常感谢您帮助我,谢谢!

代码如下:

public String pwdEncrypt(String password){
    byte[] pwdBytes = null;
    try{
        pwdBytes = password.getBytes("UTF-16LE");
    }catch(Exception e){
        e.printStackTrace();
    }

    byte[] encryptedPwd = Crypt32Util.cryptProtectData(pwdBytes);       

    return String.valueOf(Hex.encodeHex(encryptedPwd));
}   

【问题讨论】:

  • UTF-16 与 Unicdoe 不同。如果您只使用 password.getBytes() 会发生什么?您应该能够将您的编码与您发布的博客文章中的测试程序的编码进行比较。
  • 乔,谢谢!实际上我也尝试过使用 getBytes(),但结果也不起作用......我不确定 unicode 字节是如何在 C++ 或 Delphi 中组织的。我猜问题是输入 crypt API 的 pwdBytes 不正确,但不知道如何比较和修复......

标签: java rdp


【解决方案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());

【讨论】:

  • 没错,但您应该指定要使其正常工作,您还需要包括 jna 和 jna-platform (github.com/twall/jna)
  • 什么是DATA_BLOB?你是从哪里导入的?
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多