Okay, vom Vigenère Algorithmus verstehe ich nix.
Trotzdem kommt mir die Zeile
for i:=1 to ord(length(zPlaintext[i])) do
eigenartig vor.
Du lässt dir den Ordinalwert von der Länge eines Zeichens wieder geben. Das ist i.a.R. = 1!
Das heißt, deine Schleife wird nur einmal durchlaufen. Soll das so sein? Wozu dann die Schleife ??