CryptUtils.pas 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. unit CryptUtils;
  2. interface
  3. uses
  4. Windows, SysUtils;
  5. procedure Encrypt_Simple(AInput: array of Byte; AInputLength: Integer;
  6. var AOutput: array of Byte);
  7. procedure Decrypt_Simple(AInput: array of Byte; AInputLength: Integer;
  8. var AOutput: array of Byte; var AOutputLength: Integer);
  9. procedure Encrypt_BlowFish(AKey: string;
  10. AInput: array of Byte; AInputLength: Integer;
  11. var AOutput: array of Byte);
  12. procedure Decrypt_BlowFish(AKey: string;
  13. AInput: array of Byte; AInputLength: Integer;
  14. var AOutput: array of Byte; var AOutputLength: Integer);
  15. function GetOutputLength(AEncryptData: array of Byte): Integer;
  16. implementation
  17. uses
  18. BlowUnit, Cryptcon;
  19. const
  20. // 数据长度信息占用空间大小
  21. LengthSize: Integer = 4;
  22. function GetOutputLength(AEncryptData: array of Byte): Integer;
  23. var
  24. I: Integer;
  25. strHexLength: string;
  26. begin
  27. strHexLength := '';
  28. try
  29. for I := 0 to 3 do
  30. begin
  31. strHexLength := strHexLength + IntToHex(Byte(AEncryptData[I]), 2);
  32. end;
  33. Result := StrToInt('$' + strHexLength);
  34. except
  35. raise Exception.Create('加密数据不正确!');
  36. end;
  37. end;
  38. procedure Encrypt_Simple(AInput: array of Byte; AInputLength: Integer;
  39. var AOutput: array of Byte);
  40. var
  41. I, iTemp: Integer;
  42. arrBuf: array of Byte;
  43. strHexLength: string;
  44. begin
  45. SetLength(arrBuf, AInputLength);
  46. SetLength(strHexLength, LengthSize * 2);
  47. ZeroMemory(@arrBuf[0], AInputLength * SizeOf(Byte));
  48. ZeroMemory(@AOutput[0], (AInputLength + LengthSize) * SizeOf(Byte));
  49. CopyMemory(@arrBuf[0], @AInput[0], AInputLength * SizeOf(Byte));
  50. for I := 0 to AInputLength - 1 do
  51. begin
  52. AOutput[I] := arrBuf[AInputLength - I - 1];
  53. end;
  54. for I := 0 to AInputLength - 1 do
  55. begin
  56. arrBuf[I] := $FF - Byte(AOutput[I]);
  57. end;
  58. for I := 0 to AInputLength - 1 do
  59. begin
  60. if not Odd(I) then
  61. begin
  62. if(I + 1 < AInputLength) then
  63. AOutput[I + LengthSize] := arrBuf[I + 1]
  64. else
  65. AOutput[I + LengthSize] := arrBuf[I];
  66. end
  67. else
  68. AOutput[I + LengthSize] := arrBuf[I - 1];
  69. end;
  70. strHexLength := IntToHex(AInputLength, 8);
  71. for I := 0 to LengthSize do
  72. AOutput[I] := StrToInt('$' + strHexLength[I * 2 + 1] + strHexLength[I * 2 + 2]);
  73. end;
  74. procedure Decrypt_Simple(AInput: array of Byte; AInputLength: Integer;
  75. var AOutput: array of Byte; var AOutputLength: Integer);
  76. var
  77. I, iTemp: Integer;
  78. arrBuf1: array of Byte;
  79. arrBuf2: array of Byte;
  80. strHexLength: string;
  81. begin
  82. strHexLength := '';
  83. for I := 0 to 3 do
  84. begin
  85. strHexLength := strHexLength + IntToHex(Byte(AInput[I]), 2);
  86. end;
  87. AOutputLength := StrToInt('$' + strHexLength);
  88. SetLength(arrBuf1, AInputLength - LengthSize);
  89. SetLength(arrBuf2, AOutputLength);
  90. SetLength(strHexLength, LengthSize * 2);
  91. ZeroMemory(@arrBuf1[0], (AInputLength - LengthSize) * SizeOf(Byte));
  92. ZeroMemory(@arrBuf2[0], AOutputLength * SizeOf(Byte));
  93. ZeroMemory(@AOutput[0], AOutputLength * SizeOf(Byte));
  94. for I := 0 to AInputLength - LengthSize - 1 do
  95. begin
  96. if not Odd(I) then
  97. begin
  98. if (I + 1 < AOutputLength) then
  99. arrBuf1[I] := AInput[I + 1 + LengthSize]
  100. else
  101. arrBuf1[I] := AInput[I + LengthSize];
  102. end
  103. else
  104. arrBuf1[I] := AInput[I - 1 + LengthSize];
  105. end;
  106. for I := 0 to AOutputLength - 1 do
  107. begin
  108. arrBuf2[I] := $FF - Byte(arrBuf1[I]);
  109. end;
  110. for I := 0 to AOutputLength - 1 do
  111. begin
  112. AOutput[I] := arrBuf2[AOutputLength - I - 1];
  113. end;
  114. end;
  115. procedure Encrypt_BlowFish(AKey: string;
  116. AInput: array of Byte; AInputLength: Integer;
  117. var AOutput: array of Byte);
  118. var
  119. BL: TBlowFish;
  120. arrBuf: array of Byte;
  121. arrInputBuf: array of Byte;
  122. iOutputLength: Integer;
  123. strHexLength: string;
  124. I: Integer;
  125. begin
  126. BL := TBlowFish.Create(nil);
  127. try
  128. BL.CipherMode := ECBMode;
  129. BL.InputType := SourceByteArray;
  130. iOutputLength := AInputLength;
  131. if iOutputLength mod 8 <> 0 then
  132. iOutputLength := 8 * (iOutputLength div 8 + 1);
  133. SetLength(arrBuf, iOutputLength);
  134. SetLength(arrInputBuf, AInputLength);
  135. SetLength(strHexLength, LengthSize * 2);
  136. ZeroMemory(@arrBuf[0], iOutputLength * SizeOf(Byte));
  137. ZeroMemory(@arrInputBuf[0], AInputLength * SizeOf(Byte));
  138. ZeroMemory(@AOutput[0], (iOutputLength + LengthSize) * SizeOf(Byte));
  139. CopyMemory(@arrInputBuf[0], @AInput[0], AInputLength);
  140. BL.InputLength := AInputLength;
  141. BL.pInputArray := @arrInputBuf[0];
  142. BL.pOutputArray := @arrBuf[0];
  143. BL.Key := AKey;
  144. BL.EncipherData(False);
  145. strHexLength := IntToHex(AInputLength, LengthSize * 2);
  146. for I := 0 to 3 do
  147. AOutput[I] := StrToInt('$' + strHexLength[I * 2 + 1] + strHexLength[I * 2 + 2]);
  148. CopyMemory(@AOutput[4], @arrBuf[0], Length(arrBuf) * SizeOf(Char));
  149. finally
  150. BL.Free;
  151. end;
  152. end;
  153. procedure Decrypt_BlowFish(AKey: string;
  154. AInput: array of Byte; AInputLength: Integer;
  155. var AOutput: array of Byte; var AOutputLength: Integer);
  156. var
  157. BL: TBlowFish;
  158. I: Integer;
  159. arrBuf: array of Byte;
  160. arrOutBuf: array {[0..3]} of Byte;
  161. iOutputLength: Integer;
  162. strHexLength: string;
  163. begin
  164. BL := TBlowFish.Create(nil);
  165. try
  166. strHexLength := '';
  167. for I := 0 to 3 do
  168. begin
  169. strHexLength := strHexLength + IntToHex(AInput[I], 2);
  170. end;
  171. iOutputLength := StrToInt('$' + strHexLength);
  172. SetLength(arrBuf, AInputLength - LengthSize);
  173. SetLength(arrOutBuf, iOutputLength);
  174. SetLength(strHexLength, LengthSize * 2);
  175. ZeroMemory(@arrBuf[0], (AInputLength - LengthSize) * Sizeof(Byte));
  176. ZeroMemory(@arrOutBuf[0], iOutputLength * Sizeof(Byte));
  177. CopyMemory(@arrBuf[0], @AInput[4], (AInputLength - LengthSize) * SizeOf(Byte));
  178. BL.CipherMode := ECBMode;
  179. BL.InputType := SourceByteArray;
  180. BL.InputLength := AInputLength - LengthSize;
  181. BL.pInputArray := @arrBuf[0];
  182. BL.pOutputArray := {@arrOutBuf[0];//}@AOutput[0];
  183. BL.Key := AKey; //'SmartCost2004';
  184. BL.DecipherData(False);
  185. //CopyMemory(@AOutput[0], @arrOutBuf[0], iOutputLength * SizeOf(Byte));
  186. AOutputLength := iOutputLength;
  187. finally
  188. BL.Free;
  189. end;
  190. end;
  191. end.