lambdaway
::
crypt
5
|
list
|
login
|
load
|
|
_h1 [[vigenere]]| vigenere {sup 2} {require lib_beta} {macro S\.2W to S.toW} _h2 principe _p {b Alice} and {b Eve} agree on an alphabet and a key {pre {def A {A.new a b c d e f g h i j k l m n o p q r s t u v w x y z}} = {A} {def K {A.new 12 7 18 5}} = {K} } _p {b Alice} sends a message ({code {def msg rendezvousmercredi} = {msg}}) to {b Eve} encoded like this {pre '{S.2W // group chars {S.map // map {lambda {:i} // the function {A.get // getting at position computed as {% // the value of {+ // the sum {A.in? {W.get :i {msg}} {A}} // of msg[i] in alphabet {A.get {% :i 4} {K}} // and key[i%4] } 26 // modulo 26 } {A} // of alphabet } } {S.serie 0 {- {W.length {msg}} 1}} // all chars of msg }} -> {S.2W {S.map {lambda {:i} {A.get {% {+ {A.in? {W.get :i {msg}} {A}} {A.get {% :i 4} {K}} } 26 } {A} } } {S.serie 0 {- {W.length {msg}} 1}} }} } _p {b Eve} receives this message ({code {def xxx dlfiqgntgzejdjjjpp} = {xxx}}) and decodes it following the same algorithm but using the complement to 26, the alphabet's length, of each term of the key, [12,7,18,5] {pre '{S.2W {S.map {lambda {:i} {A.get {% {+ {A.in? {W.get :i {xxx}} {A}} {- 26 {A.get {% :i 4} {K}} } // complement of the key } 26 } {A} } } {S.serie 0 {- {W.length {xxx}} 1}} }} -> {S.2W {S.map {lambda {:i} {A.get {% {+ {A.in? {W.get :i {xxx}} {A}} {- {A.length {A}} {A.get {% :i 4} {K}} } } 26 } {A} } } {S.serie 0 {- {W.length {xxx}} 1}} }} } _h2 code _p And now a more general algorithm embedded in a function, with an alphabet expendable on demand {prewrap '{def vigenere {def vigenere.delta {lambda {:op :alpha :key :txt :i} {A.get {% {+ {A.in? {W.get :i :txt} :alpha} {if :op then {A.get {% :i {A.length :key}} :key} else {- {A.length :alpha} {A.get {% :i {A.length :key}} :key}}} } {A.length :alpha}} :alpha} }} {lambda {:op :txt} {let { {:op :op} {:alpha {A.new a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 + - * / = . , ; ? ' " ù é à }} {:key {A.new 12 7 18 5}} {:txt {S.2W :txt}} } {S.2W {S.map {vigenere.delta :op :alpha :key :txt} {S.serie 0 {- {W.length :txt} 1}}}} }}} -> {def vigenere {def vigenere.delta {lambda {:op :alpha :key :txt :i} {A.get {% {+ {A.in? {W.get :i :txt} :alpha} {if :op then {A.get {% :i {A.length :key}} :key} else {- {A.length :alpha} {A.get {% :i {A.length :key}} :key}}} } {A.length :alpha}} :alpha} }} {lambda {:op :txt} {let { {:op :op} {:alpha {A.new a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 + - * / = . , ; ? ' " ù é à }} {:key {A.new 12 7 18 5}} {:txt {S.2W :txt}} } {S.2W {S.map {vigenere.delta :op :alpha :key :txt} {S.serie 0 {- {W.length :txt} 1}}}} }}} } _p According to a given alphabet and a given key the {b vigenere} function is used this way: {pre '{vigenere true text} encodes text '{vigenere false text} decodes text } _h2 tests {prewrap '{def txt rendez vous mercredi à 12h30} -> {def txt rendez vous mercredi à 12h30} '{def ctxt {vigenere true {txt}}} -> {def ctxt {vigenere true {txt}}} = {ctxt} '{vigenere false {ctxt}} ->{vigenere false {ctxt}} '{def french Je voudrais mourir debout, Dans un champ, au soleil, Non dans un lit aux draps froissés, A l'ombre close des volets, Par où ne vient plus une abeille, Une abeille ... Je voudrais mourir debout, Dans un bois, au soleil, Sans entendre tout doucement, La porte et le chuchotement, Sans objet des gens et des vieilles, Et des vieilles ... Je voudrais mourir debout, N'importe où, au soleil, Tu ne serais pas là j'aurais, Ta main que je pourrais serrer, La bouche pleine de groseilles, De groseilles ...} -> {def french Je voudrais mourir debout, Dans un champ, au soleil, Non dans un lit aux draps froissés, A l'ombre close des volets, Par où ne vient plus une abeille, Une abeille ... Je voudrais mourir debout, Dans un bois, au soleil, Sans entendre tout doucement, La porte et le chuchotement, Sans objet des gens et des vieilles, Et des vieilles ... Je voudrais mourir debout, N'importe où, au soleil, Tu ne serais pas là j'aurais, Ta main que je pourrais serrer, La bouche pleine de groseilles, De groseilles ...} '{def crypt {vigenere true {french}}} -> {def crypt {vigenere true {french}}} = {crypt} '{vigenere false {crypt}} -> {vigenere false {crypt}} }
lambdaway v.20211111