如何忽略 Vigenere 密码中的空格?

How to ignore spaces in Vigenere cipher code?

我有两个功能:

function EnCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
    positionText: word;
begin
  if text=' ' then begin EnCryptSymbolVij:=' '; exit; end;
  PositionText:=pos(text,abc);
  if positionText=0 then exit;
  st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
  EnCryptSymbolVij:=st[positionText];
end;

function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
    st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
  begin
    st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
    inc(j);
    if j>length(key) then j:=1;
  end;
EnCryptVij:=st;
End;

在第一个函数中,我添加了space支持。但是当我用 spaces 加密文本时,我得到了错误的加密,因为第二个函数将 spaces 计算为 alphavit 的一部分。我该如何解决这个问题并忽略第二个函数中的加密 spaces?请帮忙解决这个问题。

您只支持字母字符和 spaces。如果你想做更多,你需要在代码中更聪明一些。空格未加密,并且 space 没有加密,因此您只需要在解密中添加该测试即可。如果您稍后支持其他非字母字符,您也需要对这些字符执行相同的操作,但加密和解密的测试是相同的。所以对于 spaces,你的符号解密代码将像你的加密一样开始,就像这样

function DeCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
    positionText: word;
begin
  if text=' ' then begin DeCryptSymbolVij:=' '; exit; end;

我个人更喜欢使用 'Result' 而不是函数名称,但这只是个人喜好。

编辑

为了满足第二个函数中的 spaces,您可以在 inc(j) 周围加上 spaces 的测试,就像这样

function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
    st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
  begin
    st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
    if st[ I ] <> ' ' then
    begin
      inc(j);
    end;
    if j>length(key) then j:=1;
  end;
EnCryptVij:=st;
End;

但对于 'future proof',您最好向第一个函数添加一个 Var 布尔参数,并在发生替换时设置它:

function EnCryptSymbolVij(text, key:char; abc:string; var changed : boolean):char;
var st: string;
    positionText: word;
begin
  changed := FALSE; 

  PositionText:=pos(text,abc);
  if positionText=0 then exit;
  // else
  changed := TRUE;
  st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
  EnCryptSymbolVij:=st[positionText];
end;

function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
  iChanged : Boolean;
    st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
  begin
    st[i]:=EnCryptSymbolVij(text[i], Key[j], abc, iChanged);
    if iChanged then
    begin
      inc(j);
    end;
    if j>length(key) then j:=1;
  end;
EnCryptVij:=st;
End;

注意第一个函数不需要space测试(假设'abc'中没有space)