Hallo,
es geht nicht um das Problem, einer ungeraden Zahl und das die Verschlüsselung funktioniert, sondern das Du auf Daten zugreifst und diese veränderst, die nicht zu deinem Bytearray gehören, weil sie schon dahinter liegen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
| {$APPTYPE CONSOLE} const MAXCNT = 1;
type TByteBuffer = array[1..MAXCNT] of byte; TTestRec = packed record Buffer : TByteBuffer; TestTheRest : byte; end; var TestRec : TTestRec;
procedure EnDecrypt(var Buffer: TByteBuffer); var x: Longword; y: Word; pWord : ^Word; pByte : ^Byte; i: Integer; begin x := $38414245; y := $3841; i := High(Buffer)-Low(Buffer)+1; IF i > 1 then begin pWord := @Buffer[Low(TByteBuffer)]; repeat pWord^ := pWord^ xor y; inc(pWord); x := x * $343FD + $269EC3; y := (x shr 16) and $7FFF; dec(i,2); until i<=1; end; IF i = 1 then begin pByte := @pWord^; pByte^:= pByte^ xor y; end; end;
procedure EnDecryptII(var Buffer: TByteBuffer); var x: Longword; y: Word; pWord : ^Word; pByte : ^Byte; i: Integer; begin x := $38414245; y := $3841; i := High(Buffer)-Low(Buffer)+1; IF i > 0 then begin pWord := @Buffer[Low(TByteBuffer)]; repeat pWord^ := pWord^ xor y; inc(pWord); x := x * $343FD + $269EC3; y := (x shr 16) and $7FFF; dec(i,2); until i<=0; end; end;
Begin writeln(' Ohne Zugriff hinter Buffer '); with Testrec do begin TestTheRest := $FF; writeln(Buffer[low(Buffer)]:5,TestTheRest:5); EnDecrypt(Buffer); writeln(Buffer[low(Buffer)]:5,TestTheRest:5); EnDecrypt(Buffer); writeln(Buffer[low(Buffer)]:5,TestTheRest:5); end; writeln; writeln(' Mit Zugriff hinter Buffer '); with Testrec do begin TestTheRest := $FF; writeln(Buffer[low(Buffer)]:5,TestTheRest:5); EnDecryptII(Buffer); writeln(Buffer[low(Buffer)]:5,TestTheRest:5); EnDecryptII(Buffer); writeln(Buffer[low(Buffer)]:5,TestTheRest:5); end; readln; end. |
Einmal wird der Wert dahinter geändert, das andere mal nicht.
Bei einem dynamschen array wird es wohl nicht auffallen, da dieses irgendwo im Speicher erzeugt wird und die Daten damit wahrscheinlich auf 4 oder 8 Byte Grenzen aligned sind und Folgedaten/Speicherreservierungen entsprechend weit weg sind, zumal sicher etwas mehr Speicher reserviert als angefordert wird.
Aber man könnte das Verfahren ja mit SSE nutzen wollen und hätte dann immer 16 Byte im Zugriff.
Aber ich will auch nicht zufällig mit dem Flugzeug abstuerzen, weil irgendwo statt 255 statt 199 steht
Gruß Horst