Codificar y descodificar en Máxima

DESCARGAR


alf:"abcdefghijklmnñopqrstuvxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ .,:áéíóúÁÉÍÓÚ";

mensajes_cif:["sqmzrkñbkmjrb númjbSSbkmÓúgcrqmqkñCkmjúWúmbrkqñqt","óyFIy,óItyAItAIyxIh,tÑyóyFÚyR,byN,yCIyC,rcG",
"MdrYBYKg.YKbWEKWRWEKEYKPYKt.oGYrdzKÚWbdNW"," VíeybKbVifbVflVtbÑQV:bVKbyyeyeVTeVtQKeÍ","DLRLódLÓfXóyfXóSLXfXórXdgÍóyyrÍfXóÓróRFófyRf","JAJKpJóflJfcgóf.Fógó fccJXgflJcfgcAgfAogD","ÚhPE zdhqyZqdíZÍzgqFZqhPZÉZdqhqiEqhUihg","NDScDYiVcfcnDiDziDYiziÑViDáczivfsztiú",
"LsOyCxíjxOñCjiXnOñjddjxOcOsxíYxOñnNnOXDxíjiísk","Ñ KHgmH xhuh tTKJmúÉhgKÚukóÁUhHk Kú kóóTVVhA","RÓd ÓbÁ QÓj Qj ÓA fbQsÓÁÓdCÓObNÓUbÓtÓlAGlUNlÉ",
"ÍWPmZdkyodkZdkOmeedkOÁHkdekúedHOúÁkIozÁé","UñmnItvAHtvVtvPnÓWtvVnIÓBñsvX:svVHvÉBWtsXB:","íBñqXIíXpXIYfñIBápNñqñmIgópNBLIíXpXIYfIñfóBBXx",
"gx.pTbRÓRTfoTéRbH.GTboffoúoTVTbRépj.foúoN","mtéAíXeRkíMéeAéheéeAxDeXXpZéxpRéXe:pRMéléAeRkíXXM,","TzKLqELudOdtGCGJGKqdsGDGdKzdyMrzuJqKdDMuJLGe",
"ZproFrgrxOroMpYApCMTzo:proTApOéTroxrTYrpt","jB,:ÓtIBsY,gU,SBsY,gU,BT,BMh,BctB:,sBLy,UÓtK"] $

claves:[[4,1],[8,2],[12,3],[16,4],[20,5],[24,6],[28,7],[32,8],[36,9],[40,10],[44,11],[48,12],[52,13],[56,14],[60,15],[64,16],[1,17],[5,18],[9,19]];

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

clave_descifrado(clave, alf):=block(

    [modulo, descifrado],
    modulo:slength(alf),
    descifrado:[mod(inv_mod(clave[1], modulo),modulo), mod(-inv_mod(clave[1], modulo)*clave[2], modulo)]

);

clave_descifrado(claves[1], alf);

descodificar(alfabeto, mensaje, clave_cif):=block(

    [mensaje_numeros, clave_descif, descif, modulo, msg],
    modulo:slength(alfabeto),
    mensaje_numeros:codi_numerica(alfabeto, mensaje),
    clave_descif:clave_descifrado(clave_cif, alfabeto),
    descif:makelist(mod(clave_descif[1]*mensaje_numeros[i]+clave_descif[2],modulo) ,i,1,length(mensaje_numeros)),
    msg:codi_numerica(alfabeto, descif),
    msg
);

descodificar(alf, mensajes_cif[17], claves[17]);

codificar(alfabeto, mensaje, clave_cif):=block(

    [mensaje_numeros, cif, modulo, msg],
    modulo:slength(alfabeto),
    mensaje_numeros:codi_numerica(alfabeto, mensaje),
    cif:makelist(mod(clave_cif[1]*mensaje_numeros[i]+clave_cif[2],modulo) ,i,1,length(mensaje_numeros)),
    msg:codi_numerica(alfabeto, cif),
    msg
);

mensaje2:"Los españoles muy españoles y mucho españoles";
clavee:[3,10];

codificar(alf, mensaje2, clavee);