CryptoARC4.Mod 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. MODULE CryptoARC4; (** AUTHOR "F.N."; PURPOSE "ALLEGED RC4 - stream cipher - keylength: from 1 to 256 bytes"; *)
  2. IMPORT
  3. Ciphers := CryptoCiphers, BIT;
  4. TYPE
  5. Cipher* = OBJECT (Ciphers.Cipher)
  6. VAR
  7. s: ARRAY 256 OF LONGINT; (* state array *)
  8. i, j: LONGINT;
  9. PROCEDURE &Init*;
  10. BEGIN
  11. SetNameAndBlocksize( "arc4", 1 );
  12. isKeyInitialized := FALSE
  13. END Init;
  14. (** initialize arc4 key. keybits = [8..2048], MUST be multiple of 8. *)
  15. PROCEDURE InitKey*( CONST src: ARRAY OF CHAR; keybits: LONGINT);
  16. VAR
  17. keydata: ARRAY 256 OF LONGINT;
  18. keybytes: LONGINT;
  19. temp: LONGINT;
  20. BEGIN
  21. ASSERT( keybits MOD 8 = 0 ); ASSERT( keybits > 7 ); ASSERT( keybits < 2049 );
  22. InitKey^( src, keybits );
  23. keybytes := keybits DIV 8;
  24. i := 0; j := 0;
  25. FOR i := 0 TO 255 DO s[i] := i END;
  26. FOR i := 0 TO 255 DO keydata[i] := ORD( src[i MOD keybytes] ) END;
  27. FOR i := 0 TO 255 DO
  28. j := (j + s[i] + keydata[i]) MOD 256;
  29. temp := s[i]; s[i] := s[j]; s[j] := temp
  30. END;
  31. isKeyInitialized := TRUE;
  32. FOR i := 0 TO 255 DO keydata[i] := 0 END; (* sniffing protection *)
  33. i := 0; j := 0;
  34. END InitKey;
  35. (** encrypt len bytes starting at position ofs. *)
  36. PROCEDURE Encrypt*( VAR buf: ARRAY OF CHAR; ofs, len: LONGINT );
  37. VAR
  38. k, temp: LONGINT;
  39. ch: CHAR;
  40. BEGIN
  41. ASSERT( isKeyInitialized );
  42. FOR k := 0 TO len-1 DO
  43. (* generation of random byte ch *)
  44. i := (i + 1) MOD 256;
  45. j := (j + s[i]) MOD 256;
  46. temp := s[i]; s[i] := s[j]; s[j] := temp;
  47. ch := CHR( s[(s[i] + s[j]) MOD 256] );
  48. (* XOR random byte with next plaintext byte *)
  49. buf[ofs + k] := BIT.CXOR( buf[ofs + k], ch );
  50. END
  51. END Encrypt;
  52. (** decrypt len bytes starting at position ofs. *)
  53. PROCEDURE Decrypt*( VAR buf: ARRAY OF CHAR; ofs, len: LONGINT );
  54. BEGIN
  55. Encrypt( buf, ofs, len )
  56. END Decrypt;
  57. END Cipher;
  58. (** create a new ARC4 cipher object *)
  59. PROCEDURE NewCipher*() : Ciphers.Cipher;
  60. VAR c: Cipher;
  61. BEGIN
  62. NEW( c ); RETURN c
  63. END NewCipher;
  64. END CryptoARC4.