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 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、私はWindowsXPを使用しています

編集:C / C ++を使用した暗号化に関するこの情報を見つけ、wincrypt.hを調べましたが、有用なものを特定できませんでした:http: //blogs.msdn.com/b/rds/archive/2007/01/22/vista -remote-desktop-connection-authentication-faq.aspx

4

4 に答える 4

2

リンクを見ると、バイト配列(CryptUtilをパスワードに適用した結果)を16進文字列表現に変換する手順が欠落しているようです。

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 に答える