循环解密和加密字符串
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 数组。
请注意,这不会解决原始代码的潜在问题。
我写了一个小程序,可以加密和解密用户给的一些字符串。
加密功能正常!但现在我必须解密它。我的问题是我真的无法想象如何实现这一步。
这是我的加密代码:
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 数组。
请注意,这不会解决原始代码的潜在问题。