2013-06-30 95 views
1

我已经尝试从SO的另一个解决方案,如:加密RDP密码与Java

String password ="pwd"; 
     WinCrypt.DATA_BLOB pDataIn = new WinCrypt.DATA_BLOB(password.getBytes(Charset.forName("UTF-16LE"))); 
     WinCrypt.DATA_BLOB pDataEncrypted = new WinCrypt.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()); 

Crypt32Util.cryptProtectData("12345".getBytes("UTF-16LE"), null, 0, "psw", null); 

但他们都得到不同的结果对于我每次运行它们时,并且它们与由MSTSC保存或由RDP Password Hasher实用程序生成的真实密码不匹配。 有谁知道可以加密密码的解决方案或CLI实用程序?

+0

“所有的人都给予了我每次运行它们时不同的结果” < - 你确定你是不是产生这个密码的_hash_而不是加密的形式?如果它是一个散列,那么它可以随着时间改变是非常正常的,这个散列是盐渍的...... – fge

回答

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"; 
     } 
    }