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

时间:2017-07-23 18:14:08

标签: delphi encryption spaces vigenere

我有两个功能:

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;

在第一个函数中,我添加了空间支持。但是当我使用空格加密文本时,我得到了错误的加密,因为第二个函数将空格视为alphavit的一部分。如何修复此问题并忽略第二个函数中的加密空间?请帮助解决这个问题。

1 个答案:

答案 0 :(得分:1)

您只支持字母字符和空格。如果你想做更多,你需要在代码中更聪明一些。空格未加密,并且没有任何内容加密到空间,因此您只需要在解密中添加该测试。如果您以后支持其他非字母字符,您也需要对它们执行相同的操作,但加密和解密的测试相同。因此,对于空格,符号的解密代码将像加密一样启动,如此

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

我个人更喜欢使用'结果'而不是功能名称,但这只是个人偏好。

修改

为了满足第二个功能中的空间,你可以用一个空格测试来包围inc(j),就像这样

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;

但是为了'未来证明',你可能最好在第一个函数中添加一个Var boolean参数,并在发生替换时设置它:

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;

请注意,第一个函数不需要空间测试(假设'abc'中没有空格)