CryptUtils.pas 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. APInput: Pointer; AInputLength: Integer;
  11. var APOutput: Pointer; var AOutputLength: Integer);
  12. procedure Decrypt_BlowFish(AKey: string;
  13. APInput: Pointer; AInputLength: Integer;
  14. var APOutput: Pointer; 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 - 1 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. APInput: Pointer; AInputLength: Integer;
  117. var APOutput: Pointer; var AOutputLength: Integer);
  118. var
  119. BL: TBlowFish;
  120. arrBuf: array of Byte;
  121. arrInputBuf: array of Byte;
  122. arrOutputBuf: array of Byte;
  123. iOutputLength: Integer;
  124. strHexLength: string;
  125. I: Integer;
  126. begin
  127. BL := TBlowFish.Create(nil);
  128. try
  129. BL.CipherMode := ECBMode;
  130. BL.InputType := SourceByteArray;
  131. iOutputLength := AInputLength;
  132. if iOutputLength mod 8 <> 0 then
  133. iOutputLength := 8 * (iOutputLength div 8 + 1);
  134. AOutputLength := (iOutputLength + SizeOf(Integer)) * SizeOf(Byte);
  135. if not Assigned(APOutput) then
  136. APOutput := AllocMem(AOutputLength);
  137. SetLength(arrBuf, iOutputLength);
  138. SetLength(arrInputBuf, AInputLength);
  139. SetLength(arrOutputBuf, AOutputLength);
  140. SetLength(strHexLength, LengthSize * 2);
  141. ZeroMemory(@arrBuf[0], iOutputLength * SizeOf(Byte));
  142. ZeroMemory(@arrInputBuf[0], AInputLength * SizeOf(Byte));
  143. ZeroMemory(@arrOutputBuf[0], AOutputLength * SizeOf(Byte));
  144. ZeroMemory(APOutput, AOutputLength);
  145. CopyMemory(@arrInputBuf[0], APInput, AInputLength);
  146. BL.InputLength := AInputLength;
  147. BL.pInputArray := @arrInputBuf[0];
  148. BL.pOutputArray := @arrBuf[0];
  149. BL.Key := AKey;
  150. BL.EncipherData(False);
  151. strHexLength := IntToHex(AInputLength, LengthSize * 2);
  152. for I := 0 to SizeOf(Integer) - 1 do
  153. arrOutputBuf[I] := StrToInt('$' + strHexLength[I * 2 + 1] + strHexLength[I * 2 + 2]);
  154. CopyMemory(@arrOutputBuf[SizeOf(Integer) - 1], @arrBuf[0], Length(arrBuf));
  155. CopyMemory(APOutput, @arrOutputBuf[0], AOutputLength);
  156. finally
  157. BL.Free;
  158. end;
  159. end;
  160. procedure Decrypt_BlowFish(AKey: string;
  161. APInput: Pointer; AInputLength: Integer;
  162. var APOutput: Pointer; var AOutputLength: Integer);
  163. var
  164. BL: TBlowFish;
  165. I: Integer;
  166. arrBuf: array of Byte;
  167. arrInputBuf: array of Byte;
  168. arrOutBuf: array of Byte;
  169. iOutputLength: Integer;
  170. strHexLength: string;
  171. begin
  172. BL := TBlowFish.Create(nil);
  173. try
  174. SetLength(arrBuf, AInputLength - LengthSize);
  175. SetLength(arrInputBuf, AInputLength);
  176. SetLength(strHexLength, LengthSize * 2);
  177. ZeroMemory(@arrBuf[0], (AInputLength - LengthSize) * Sizeof(Byte));
  178. ZeroMemory(@arrInputBuf[0], AInputLength * Sizeof(Byte));
  179. CopyMemory(@arrInputBuf[0], APInput, AInputLength * SizeOf(Byte));
  180. CopyMemory(@arrBuf[0], @arrInputBuf[4], (AInputLength - LengthSize) * SizeOf(Byte));
  181. strHexLength := '';
  182. for I := 0 to 3 do
  183. begin
  184. strHexLength := strHexLength + IntToHex(arrInputBuf[I], 2);
  185. end;
  186. iOutputLength := StrToInt('$' + strHexLength);
  187. SetLength(arrOutBuf, iOutputLength);
  188. ZeroMemory(@arrOutBuf[0], iOutputLength * Sizeof(Byte));
  189. BL.CipherMode := ECBMode;
  190. BL.InputType := SourceByteArray;
  191. BL.InputLength := AInputLength - LengthSize;
  192. BL.pInputArray := @arrBuf[0];
  193. BL.pOutputArray := {@arrOutBuf[0];//}@arrOutBuf[0];
  194. BL.Key := AKey; //'SmartCost2004';
  195. BL.DecipherData(False);
  196. if not Assigned(APOutput) then
  197. APOutput := AllocMem(iOutputLength);
  198. CopyMemory(APOutput, @arrOutBuf[0], iOutputLength * SizeOf(Byte));
  199. AOutputLength := iOutputLength;
  200. finally
  201. BL.Free;
  202. end;
  203. end;
  204. end.