// Retourne la matrice représentant l'alphabet (majuscules, code ASCII)
function X = alpha()
  for i = 65:90
    X(i-64) = i;
  end
endfunction

// Permutation : effectue n permutations aléatoires sur un tableau de lettres X
function res = perm(n,X)
  if n > 0
    a = 1 + 25*rand();
    b = 1 + 25*rand();
    if (a == b)
      res = perm(n,X)
    else
      tmp = X(a);
      X(a) = X(b);
      X(b) = tmp;
      res = perm(n-1,X)
    end
  else
    res = X
  end  
endfunction

// Décale de k lettres un tableau de lettres X
// (k positif)
function res = decal(k,X)
  for i = 65:90
    if (X(i-64)+k > 90)
      X(i-64) = X(i-64)+k-26
    else
      X(i-64) = X(i-64)+k;
    end
  end
  res = X;
endfunction

// Génère une clé pour le chiffrement
// n permutations, lettres décalées de k lettres
function X = getKey(n,k)
  X = perm(n,alpha());
  X = decal(k,X);
endfunction

// Chiffrement de César basique : décale de k lettres
function X = getKeyCesar(k)
  X = decal(k,alpha());
endfunction

// Chiffrement de s avec une permutation X quelconque
function res = chiff(X, s)
  Y = ascii(convstr(s,'u'));
  l = length(s);
  for i = 1:l
    if Y(i) > 64
      Y(i) = X(Y(i)-64);
    end
  end
  res = ascii(Y);
endfunction

// Avec une clé quelconque (y compris César) X, déchiffre un message s
function res = dechiff(X, s)
  Y = ascii(convstr(s,'u'));
  A = alpha();
  l = length(s);
  for i = 1:l
    if (Y(i) > 64)
      d = find(X == Y(i));
      Y(i) = A(d(1));
    end
  end
  res = ascii(Y);
endfunction

// Obtention des fréquences de lettres dans une chaîne s
function X = freqChar(s)
  X = zeros(1,26);
  l = length(s);
  Y = ascii(convstr(s,'u'));
  for i = 1:l
    if (Y(i) > 64)
      X(Y(i)-64) = X(Y(i)-64)+1;
    end
  end
endfunction

// Piratage du chiffrement César
// (détermine un simple décalage)
function res = piratCesar(s)
  F = freqChar(s);
  m = max(F);
  d = find(F == m) - 5;
  X = decal(d,alpha());
  res = dechiff(X,s);
endfunction

// Lettres classées selon leur ordre de fréquence dans le langage français
listFreq = ascii("EASINTRLUODCMPGVBFQHXJYKWZ");

// Construction selon un tableau de fréquences de lettres F d'une pseudo-clé pour le piratage d'une chaîne encodée
function X = assignFreq(F)
  m = max(F);
  i = 1;
  for i = 1:26 // Y = classement décroissant de positions selon fréquence
    d = find(F == m);
    Y(i) = d(1); // Position de la lettre trouvée
    F(d(1)) = -1;
    m = max(F);
  end
  A = alpha();
  for i = 1:26
    X((listFreq(i)-64)) = A(Y(i)); // Assignation de la lettre présumée
  end
endfunction

// Tentative de piratage d'un chiffrement quelconque
function res = pirat(s)
  F = freqChar(s);
  X = assignFreq(F);
  res = dechiff(X,s);
endfunction

msg = "JLI CR KIZSLEV SLJKVIZVLIV U LE SLJ HLZ KIREJYRSLKRZK MVIJ LE SLK GVL SLTFCZHLV UVJ SLIVRLTIRKVJ RSLKZJ LE SLICVJHLV WLERDSLCV R CR SLTTLCV CFZE UL SLJKV VK RL XZSLJ JREJ SLIRE WZK SILJHLVDVEK UL XIRSLXV TFEKIV LE SLIXIRMV HLZ CV SFLJTLCRZK SLKFI P R UV C RSLJ J RKKIZSLREK LE KRSLIVK ZC J P TLCSLKR KVC LE FLIJ UREJ LEV TRDSLJV SLCKVIZVLIVDVEK VE LE TFETZCZRSLCV ZC SLKZERZK TVKKV JKZSLCRKZFE SLJV TV XCFSLCVLO SLKFE SLTYV DRC KFE SLIEFLJ";

// L'exécution des lignes :
// X = alpha();
// Puis répétitivement :
// X = decal(1,X);
// dechiff(X,msg)
// (sous l'espoir de trouver quelque chose de sensé)
//
// nous donne le message clair suivant :
// SUR LA TRIBUNE BUSTERIEURE D UN BUS QUI TRANSHABUTAIT VERS UN BUT PEU BUCOLIQUE DES BUREAUCRATES ABUTIS UN BURLESQUE FUNAMBULE A LA BUCCULE LOIN DU BUSTE ET AU GIBUS SANS BURAN FIT BRUSQUEMENT DU GRABUGE CONTRE UN BURGRAVE QUI LE BOUSCULAIT BUTOR Y A DE L ABUS S ATTRIBUANT UN TABURET IL S Y CULBUTA TEL UN OURS DANS UNE CAMBUSE BULTERIEUREMENT EN UN CONCILIABULE IL BUTINAIT CETTE STIBULATION BUSE CE GLOBULEUX BUTON BUCHE MAL TON BURNOUS (...what the fuck?)
// (obtenu avec dechiff(decal(17,alpha()),msg))
//
// On notera l'allitération en "b" qui fausse l'analyse fréquentielle,
// qui se base sur la fréquence des lettres en discours régulier.
// En effet, le "b" dominant en fréquence décale le classement des autres
// lettres et notre tentative de piratage s'est vue soudainement aplatie...