循环解密和加密字符串

Decrypt and encrypt string in loops

我写了一个小程序,可以加密和解密用户给的一些字符串。

加密功能正常!但现在我必须解密它。我的问题是我真的无法想象如何实现这一步。

这是我的加密代码:

function encrypt(origin: string; cols: byte; fillChar: char): string;
var
  a, c, d, e, rest, restfill, langewort: integer;
  temp1, temp2: string;
begin
  langewort := length(origin);
  rest := length(origin) mod cols;
  restfill := cols - rest;

  if (rest = 0) then
    restfill := cols - 1
  else
  begin
    for c := 1 to restfill do
    begin
      origin := origin + fillChar;
    end;
  end;

  temp1 := '';

  for d := 1 to cols do
  begin
    for e := 0 to restfill - 1 do
    begin
      temp1 := temp1 + origin[d + cols * e];
    end;
  end;
  encrypt := temp1;
end;

假设我们使用这个字符串 Stringnum ,加密后我们有这个:Snmtg$rn$iu$ 解密函数必须反转它并删除 fillChar。

我会从:

开始
function decrypt(origin: string; cols: byte; fillChar: char): string;
var
  a, c, d, e, rest, restfill, langewort: integer;
  temp1, temp2: string;
begin
  langewort := length(origin);
  rest := length(origin) mod cols;
  restfill := cols - rest;

  if (rest = 0) then
    restfill := cols - 1
  else
  begin
    for c := 1 to restfill do
    begin
      origin := origin + fillChar;
    end;
  end;

  temp1 := '';

  for d := 1 to cols do
  begin
    for e := 0 to restfill - 1 do
    begin
      temp1 := temp1 + origin[d - cols * e]; //<- change made here ?
    end;
  end;
  decrypt := temp1;
end;

尽管有我上面的评论,这里还是一个通用帮手。您的加密本质上是为了生成原始的字谜而设计的,并且您使用字符串连接将您按特定顺序进行操作。如果您像这样重新排列代码

  SetLength( Temp1, Length( Origin )); // or cheat with Temp1 := origin


  for d := 1 to cols do
  begin
    for e := 0 to restfill - 1 do
    begin
      temp1[ (d-1) * restfill + e + 1] := origin[d + cols * e];
    end;
  end;

你本质上是在做同样的事情,但顺序不那么重要,反向算法变得更加明显

  SetLength( Temp1, Length( Origin )); // or cheat with Temp1 := origin


  for d := 1 to cols do
  begin
    for e := 0 to restfill - 1 do
    begin
      temp1[d + cols * e] := origin[ (d-1) * restfill + e + 1];
    end;
  end;  //(the meaning of temp1 and origin is reversed of course)

这不会填充 'right order' 中的字符串,但这并不重要,因为我们现在将字符串视为 char 数组。

请注意,这不会解决原始代码的潜在问题。