; RC4 in Scheme. ; See note at http://cap-lore.com/code/Scheme/reposIntro/rc4.html . (define (Do n p) (if (> n 0) (let ((u (- n 1))) (p u) (Do u p)))) (define (grc4 key)(let ((s (make-string 256))(i 0)(j 0)) (Do 256 (lambda(n) (string-set! s n (integer->char n)))) (let ((len (string-length key))(j 0)) (Do 256 (lambda (k) (let ((i (- 255 k))) (set! j (modulo (+ j (char->integer (string-ref s i)) (char->integer (string-ref key (modulo i len)))) 256)) (let ((t (string-ref s i))) (string-set! s i (string-ref s j)) (string-set! s j t)))))) (lambda (n)(let ((v 0)) (Do n (lambda (dm) (set! i (if (= i 255) 0 (+ i 1))) (let* ((a (string-ref s i))(A (char->integer a))) (set! j (modulo (+ j A) 256)) (let* ((b (string-ref s j))(B (char->integer b))) (string-set! s i b)(string-set! s j a) (set! v (+ (* 256 v) (char->integer (string-ref s (modulo (+ A B) 256))))))))) v)))) (define pr (let ((px (lambda (h) (display (string-ref "0123456789abcdef" h))))) (lambda (s) (let ((l (string-length s))) (newline) (Do l (lambda (n) (let ((k (char->integer (string-ref s (- (- l 1) n))))) (px (quotient k 16))(px (modulo k 16))))))))) (define (rd x) (let* ((l (/ (string-length x) 2)) (n (make-string l)) (hx (lambda (j) (let ((u (char->integer (string-ref x j)))) (- u (if (< u 58) 48 87)))))) (Do l (lambda (j) (string-set! n j (integer->char (+ (* 16 (hx (+ j j))) (hx (+ j j 1))))))) n)) (define xx (grc4 "keytext")) (newline) ; => (179)(69)(136)(154)(208)(235)(123)(244)(57)(47)(193)(120)(186)(128)(235)(213)(86)(173)(69)(216)(182)(133)(211)(184)(203)(226)(114)(56)(200)(27) (define xx (grc4 "keytext")) (Do 400 (lambda (dm) (xx 256))) (Do 30 (lambda(x)(write (list (xx 1)))))(newline) ; => (28)(43)(69)(134)(42)(184)(169)(248)(67)(151)(87)(172)(232)(186)(70)(164)(94)(112)(237)(106)(199)(205)(73)(109)(244)(107)(60)(62)(97)(200)