eigener krypto algorithmus sicher?

moin,

bin gerade dabei ein programm zu coden welches einen string in eine zeichenkette codiert, und wollte jetzt mal wissen, ob dieses verfahren sicher ist,
so wird zum beispie das wort "intehligentzkwozient" in
"72x11214040x56x84x72x56x40x98x16020877x18410518272x40x112140" umgewandelt, oder "hundehuette" in
"64x16898x32x35x56x16840x16014040x"
beim umwandeln wird ein binärschlüssel verwendet, dessen länge frei wälbar ist(destolänger der schlüssel, desto sicherer, in den oberen beispielen habe ich eine 10 zeichen langen schlüssel verwendet...
kann man dieses verfahren leicht entschlüsseln?
danke schonmal im vorraus
 
hier der source:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var input:string;
key:string;
alpha:integer;
i:integer;
begin
input := edit1.Text;
key := edit2.Text;

edit3.Clear;

while length(edit1.Text) > length(edit2.Text) do begin
edit2.Text := edit2.Text + edit2.Text
end;

for i := 1 to length(input) do begin

if input = 'a' then begin
alpha := 1;
end
else if input = 'b' then begin
alpha := 2;
end
else if input = 'c' then begin
alpha := 3;
end
else if input = 'd' then begin
alpha := 4;
end
else if input = 'e' then begin
alpha := 5;
end
else if input = 'f' then begin
alpha := 6;
end
else if input = 'g' then begin
alpha := 7;
end
else if input = 'h' then begin
alpha := 8;
end
else if input = 'i' then begin
alpha := 9;
end
else if input = 'j' then begin
alpha := 10;
end
else if input = 'k' then begin
alpha := 11;
end
else if input = 'l' then begin
alpha := 12;
end
else if input = 'm' then begin
alpha := 13;
end
else if input = 'n' then begin
alpha := 14;
end
else if input = 'o' then begin
alpha := 15;
end
else if input = 'p' then begin
alpha := 16;
end
else if input = 'q' then begin
alpha := 17;
end
else if input = 'r' then begin
alpha := 18;
end
else if input = 's' then begin
alpha := 19;
end
else if input = 't' then begin
alpha := 20;
end
else if input = 'u' then begin
alpha := 21;
end
else if input = 'v' then begin
alpha := 22;
end
else if input = 'w' then begin
alpha := 23;
end
else if input = 'x' then begin
alpha := 24;
end
else if input = 'y' then begin
alpha := 25;
end
else if input = 'z' then begin
alpha := 26;
end
else if input = ' ' then begin
alpha := 27;
end;


if key = '0' then begin

alpha := alpha * 7;

if length(inttostr(alpha)) = 1 then begin
edit3.text := edit3.text + inttostr(alpha) + 'xx';
end
else if length(inttostr(alpha)) = 2 then begin
edit3.Text := edit3.Text + inttostr(alpha) + 'x';
end
else if length(inttostr(alpha)) = 3 then begin
edit3.Text := edit3.Text + inttostr(alpha);
end;


end
else if key = '1' then begin
alpha := alpha * 8;
if length(inttostr(alpha)) = 1 then begin
edit3.Text := edit3.Text + inttostr(alpha) + 'xx';
end
else if length(inttostr(alpha)) = 2 then begin
edit3.Text := edit3.Text + inttostr(alpha) + 'x';
end
else if length(inttostr(alpha)) = 3 then begin
edit3.Text := edit3.Text + inttostr(alpha);
end;



end;

end;



end;

end.

das ist der source vom decodierer, der source vom encoder entschlüsselt das ganze dann noch entsprechend ...
 
Wenn man den Cipher z.B. der 'hundehuette' mal auseinanderklamüsert und um die 'x' bereinigt und dann schaut, ob die die verbleibenden Zahlen durch 7 oder 8 teilbar sind, bekommt man relativ schnell ein recht genaues Abbild des cleartext.

64/8 => 8 => h
168/8 oder 168/7 => 21 oder 24 => u oder x
98 => 14 => n
32 => 4 => d
35 => 5 => e
56/8 oder 56/7 => 7 oder 8 => g oder h
168/8 oder 168/7 => 21 oder 24 => u oder x
40 => 5 => e
160 => 20 => t
140 => 20 => t
40 => 5 => 8

'h'('u'|'x')'nde'('g'|'h')('u'|'x')'ette'

...
 
könnte man natürlich den binärschlüssel in eine normale zahlenkette umwaqndeln, dann hätte man nicht nur /7 oder /8 möglichkeiten, oder man ändert die rechen operation selber, sodass sie - ohne den quelltext- nicht so leicht zu durchschauen ist...

wenn jemand verbesserungsvorschläge hat bitte posten ...
 
"einen string in eine zeichenkette codieren" - hört sich gut an :) aber passt schon

also wenn ich mir zeichenketten und die dazugehörigen schlüssel so angucke sieht das ganze sehr unsicher aus

hab mir das jetzt nicht so genau angeguckt aber das x ist bei dir ein art trennzeichen oder?
soetwas solltest du auf jedenfall vermeiden weil es die sache extrem vereinfacht dies zu entschlüsseln
wieviele zeichen zu einem wert (oder mehreren) gehören sollte eindeutig sein und keine trennzeichen erfordern (d.h. nicht das zu jedem wert eine konstante anzahl von zeichen gehören sollte!)

die riesige elseif schleife kannst du dir sparen
sowas erledigt man normalerweise über die ascii werte der einzelnen buchstaben

du solltest auch mehr umherrechnen und bitoperationen benutzen
dort musst du allerdings beachten das informationen verloren gehen können zB bei bitverschiebungen

wie du eben selber schon geschrieben hast solltest du bei deinem schlüssel auch nicht nur dieses 0 => 7 und 1 => 8 verwenden
das macht deinen schlüssel ziemlich sinnlos weil es dann egal bei welchem schlüssel immer nur 2 möglichkeiten pro zeichen gibt
und das ist alles andere als sicher weil man ja nur ein bisschen umher probieren muss

btw hast du die wörter encoden und decoden verwechselt
ein decoder entschlüsselt und nicht umgekehrt
 
das x ist kein trennzeichen, sondern wird impletiert wenn das produkt aus schlüssel und string nicht 3 stellig ist.
trennzeichen(leerstellen) werden wie normale zeichen generiert, also auch mitverschlüsselt...
EDIT:das hier wár mein erster krypt versuch habe davor nur mal was von der caesar verschlüsselung gelesen, vielleicht beschäftige ich mich mal genauer mit dem thema verschlüsselung, der hier verwendete algo war einfach so "aus dem ärmer geschüttelt" ...

EDIT2: Warum funzt das nicht:

j := 1;

for i := 1 to length(memo1.text) do begin
code := memo1.Text[j] + memo1.Text[j+1];
ascii := strtofloat(code)/strtofloat(key);

j := j + 2;
end;

danke schonmal
 
Zurück
Oben