Vigenere en Máxima

alf:"abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQ-RSTUVWXYZáéíóúÁÉÍÓÚ0123456789 ,.;:";


codi_numerica(alf,msj):=block(
    [extra],
if stringp(msj) then (
    extra:makelist(mod(sposition(charat(msj,i),alf),slength(alf)),i,1,slength(msj))
     )
           else
        (
        extra:"",
        for i in msj do extra:concat(extra,alf[i-1])
        ),
    extra
    )$

hacer_clave(clave,longitud):=block(

    [solucion],
    solucion:"",
    for i:0 thru longitud do (
        solucion:concat(solucion,clave[mod(i,slength(clave))])
    ),
    solucion
);

/*funcion vigenere*/
vigenere(alfabeto, mensaje, clave):=block(

    [modulo, secuencia, secuencia_clave, longitud_clave, longitud_mensaje, solucion, secuencia_solucion],
    modulo:slength(alfabeto),
    secuencia:codi_numerica(alfabeto, mensaje),
    longitud_clave:slength(clave),  
    longitud_mensaje:slength(mensaje),
    secuencia_clave:codi_numerica(alfabeto, hacer_clave(clave, longitud_mensaje)),
    secuencia_solucion:makelist(mod(secuencia[i]-secuencia_clave[i], modulo),i,1,longitud_mensaje),
    solucion:codi_numerica(alfabeto,secuencia_solucion),
    solucion


);

/*ejecutar la funcion*/
vigenere(alf,":DoqqO67ogwegvwñAUgÑi6rodo:qWxjyKxYhVfÍeoi,:rlhujplCDR2;o6Bavz:fú6ndw", "G1-01: 2 de enero");