注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

RDP密码Hash加解密单元  

2013-11-05 15:31:49|  分类: Socket |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
JwAPI的SVN地址:https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/trunk


  1. {******************************************************************}  
  2. { Author: Remko Weijnen (r dot weijnen at gmail dot com)           }  
  3. { Version: 0.1                                                     }  
  4. { Date: 21-03-2007                                                 }  
  5. {                                                                  }  
  6. { The contents of this file are subject to                         }  
  7. { the Mozilla Public License Version 1.1 (the "License"); you may  }  
  8. { not use this file except in compliance with the License. You may }  
  9. { obtain a copy of the License at                                  }  
  10. { http://www.mozilla.org/MPL/MPL-1.1.html                          }  
  11. {                                                                  }  
  12. { Software distributed under the License is distributed on an      }  
  13. { "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   }  
  14. { implied. See the License for the specific language governing     }  
  15. { rights and limitations under the License.                        }  
  16. {******************************************************************}  
  17.   
  18. unit RDPHash;  
  19.   
  20. interface  
  21.   
  22. uses  
  23.   Windows, Sysutils, JwaWinCrypt;  
  24.   
  25. function CryptRDPPassword(sPassword: string): string;  
  26. function DecryptRDPPassword(sPasswordHash: string): string;  
  27. function BlobDataToHexStr(P: PByte; I: Integer): string;  
  28. function PasswordHashToBlobData(sPasswordHash: string): DATA_BLOB;  
  29.   
  30. implementation  
  31.   
  32. {***********************************************************}  
  33. { HexToByte: Converts Hex value to Byte                     }  
  34. { Found this somewhere on the internet                      }  
  35. {***********************************************************}  
  36. function HexToByte(s : String): Byte;  
  37. const  
  38.   cs = '0123456789ABCDEF';  
  39. begin  
  40.   result := 0;  
  41.   if (length(s) = 2and  
  42.      //(s[1] in ['0'..'9','A'..'F']) and  
  43.      CharInSet(s[1], ['0'..'9','A'..'F']) and  
  44.      //(s[2] in ['0'..'9','A'..'F']) then  
  45.      CharInSet(s[2], ['0'..'9','A'..'F']) then  
  46.     result := ((pos(s[1],cs)-1) *16) + (pos(s[2],cs)-1)  
  47.   else raise EConvertError.CreateFmt('%s is not a Hexformatstring',[s]);  
  48. end;  
  49.   
  50. {***********************************************************}  
  51. { PasswordHashToBlobData: Converts a RDP password Hash to   }  
  52. {                         a DATA_BLOB structure             }  
  53. { sPasswordHash : RDP Password Hash (HEX String             }  
  54. {***********************************************************}  
  55. function PasswordHashToBlobData(sPasswordHash: string): DATA_BLOB;  
  56. var Buf: array of Byte;  
  57.   dwBufSize: Cardinal;  
  58.   i: Cardinal;  
  59.   j: Cardinal;  
  60.   dwHashSize: Cardinal;  
  61. begin  
  62.   dwBufSize := Length(sPassWordHash) DIV 2;  
  63.   dwHashSize := Length(sPasswordHash);  
  64.   SetLength(Buf, dwBufSize);  
  65.   
  66.   i := 1;  
  67.   j := 0;  
  68.   while i < dwHashSize do begin  
  69.     Buf[j] := HexToByte(sPassWordHash[i] + sPassWordHash[i+1]);  
  70.     Inc(i, 2);  
  71.     Inc(j);  
  72.   end;  
  73.   
  74.   GetMem(Result.pbData, dwBufSize);  
  75.   Result.cbData := dwBufSize;  
  76.   Result.pbData := PByte(Buf);  
  77. end;  
  78.   
  79. {***********************************************************}  
  80. { BlobDataToHexStr: Converts a PByte from a DATA_BLOB       }  
  81. {                   to a Hex String so it can be saved in   }  
  82. {                   an RDP file                             }  
  83. { P : PByte (pbData) from DATA_BLOB                         }  
  84. { I : Integer (cbData) from DATA_BLOB                       }  
  85. {***********************************************************}  
  86. function BlobDataToHexStr(P: PByte; I: Integer): string;  
  87. var HexStr: string;  
  88. begin  
  89.   HexStr := '';  
  90.   while (I > 0do begin  
  91.     Dec(I);  
  92.     HexStr := HexStr + IntToHex(P^, 2);  
  93.     Inc(P);  
  94.   end;  
  95.   Result := HexStr;  
  96. end;  
  97.   
  98. {***********************************************************}  
  99. { CryptRDPPassword: Converts a plaintext password to        }  
  100. {                   encrypted password hash                 }  
  101. {                   an RDP file                             }  
  102. { sPassword: plaintext password                             }  
  103. {***********************************************************}  
  104. function CryptRDPPassword(sPassword: string): string;  
  105. var  
  106.   DataIn: DATA_BLOB;  
  107.   DataOut: DATA_BLOB;  
  108.   pwDescription: PWideChar;  
  109.   PwdHash: string;  
  110. begin  
  111.   PwdHash := '';  
  112.   
  113.   DataOut.cbData := 0;  
  114.   DataOut.pbData := nil;  
  115.   
  116.   // RDP uses UniCode  
  117.   DataIn.pbData := Pointer(WideString(sPassword));  
  118.   DataIn.cbData := Length(sPassword) * SizeOf(WChar);  
  119.   
  120.   // RDP always sets description to psw  
  121.   pwDescription := WideString('psw');  
  122.   
  123.   if CryptProtectData(@DataIn,  
  124.                       pwDescription,  
  125.                       nil,  
  126.                       nil,  
  127.                       nil,  
  128.                       CRYPTPROTECT_UI_FORBIDDEN, // Never show interface  
  129.                       @DataOut) then  
  130.   begin  
  131.     PwdHash := BlobDataToHexStr(DataOut.pbData, DataOut.cbData);  
  132.   end;  
  133.   Result := PwdHash;  
  134.   
  135.   // Cleanup  
  136.   LocalFree(Cardinal(DataOut.pbData));  
  137.   LocalFree(Cardinal(DataIn.pbData));  
  138. end;  
  139.   
  140. {***********************************************************}  
  141. { DecryptRDPPassword: Converts an RDP Password Hash back    }  
  142. {                     to it's original password.            }  
  143. {                     Note that this only works for the user}  
  144. {                     who encrypted the password (or on the }  
  145. {                     same computer in case it was encrypted}  
  146. {                     with the computerkey                  }  
  147. { sPasswordHash: Password hash (string)                     }  
  148. {***********************************************************}  
  149. function DecryptRDPPassword(sPasswordHash: string): string;  
  150. var  
  151.   DataIn: DATA_BLOB;  
  152.   DataOut: DATA_BLOB;  
  153.   sPassword: string;  
  154.   pwDecrypted: PWideChar;  
  155.   pwDescription: PWideChar;  
  156. begin  
  157.   DataIn := PasswordHashToBlobData(sPasswordHash);  
  158.   
  159.   DataOut.cbData := 0;  
  160.   DataOut.pbData := nil;  
  161.   
  162.   if CryptUnprotectData(@DataIn,  
  163.                         @pwDescription,  
  164.                         nil,  
  165.                         nil,  
  166.                         nil,  
  167.                         CRYPTPROTECT_UI_FORBIDDEN, // Never show interface  
  168.                         @DataOut) then  
  169.   begin  
  170.     Getmem(pwDecrypted, DataOut.cbData);  
  171.     lstrcpynW(pwDecrypted, PWideChar(DataOut.pbData), (DataOut.cbData DIV 2) + 1);  
  172.     sPassword := pwDecrypted;  
  173.     FreeMem(pwDecrypted);  
  174.   end  
  175.   else  
  176.     raise EConvertError.CreateFmt('Error decrypting: %s',[SysErrorMessage(GetLastError)]);  
  177.   
  178.   Result := sPassword;  
  179.   
  180.   // Cleanup  
  181.   if DataOut.cbData > 0 then  
  182.     LocalFree(Cardinal(DataOut.pbData));  
  183. end;  
  184.   
  185. end
  评论这张
 
阅读(771)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017