martes, 29 de diciembre de 2015

Gravity Falls

Por motivos que no aclararé, me hallo descifrando los mensajes secretos de Gravity Falls.

If you do not understand spanish, you can ask me to translate this text to english and I will put the job in the backlog

Me basé en unos programitas en python que había desarrollado para Crypto I de Coursera, que comenzé y abandoné dos veces pues al final se pone demasiado matemático para mis capacidades. Aún así, aprendí muchísimo y no dudo en recomendarlo.

La idea es que, según me han contado, hay varios cifrados. Un Caesar(3), una substitución y según pude ver de casualidad en un mensaje, un Atbash, que viene a ser 'a' -> 'z', 'b'->'y'...


$ python GravityFalls.py
?: m
    PU. FDHVDULDQ ZLOO EH RXW QHAW ZHHN. PU. DWEDVK ZLOO VXEVWLWXWH.
    ??. ????????? ???? ?? ??? ???? ????. ??. ?????? ???? ??????????.
?: try Caesar
  1 OT. ECGUCTKCP YKNN DG QWV PGZV YGGM. OT. CVDCUJ YKNN UWDUVKVWVG.
  2 NS. DBFTBSJBO XJMM CF PVU OFYU XFFL. NS. BUCBTI XJMM TVCTUJUVUF.
  3 MR. CAESARIAN WILL BE OUT NEXT WEEK. MR. ATBASH WILL SUBSTITUTE.
  4 LQ. BZDRZQHZM VHKK AD NTS MDWS VDDJ. LQ. ZSAZRG VHKK RTARSHSTSD.

   ...

Tengo entendido que buscando en Internet se halla la tabla de la substitución pero, ¿cuál es la gracia?

Como los mensajes están en inglés, el código y la interfaz tambien.

El programa soporta sólo maýusculas e ignora la puntuación, tal como son todos los mensajes obtenidos.

Emite estadísticas de frecuencia de caracteres, bigramas y trigramas, junto con tablas de frecuencias de las mismas en inglés. Esto sirve para descubrir las tablas de substitución.


¿Unit Testing? Eeeh, si, ad hoc, al comienzo orientado a refactorización y luego derivando a TDD.

¿Performance? Bueno, hay operaciones cuestionables desde ese punto de vista, como recalcular las frecuencias al pedir su visualización sin que nada haya cambiado.

¿Arquitectura? Es como la arquitectura de un banco de plaza, es poco. Es lo más sencilla posible para que sea comprensible y expandible. Lo mencionable es el Chain of Responsability para la ejecución de los comandos y el tímido MVC. Los componentes son Model y teñido por Controller en accept() y View está completamente separado.

Sintetizando, este proyecto te puede servir para aprender o practicar:
  • criptoanálisis básico
  • inglés (mensajes, interfaz, código)
  • programación (python, patrones)
En https://github.com/cpantel/gravityFalls está el código. Sólo he comiteado lo mínimo indispensable pues en el proceso de desarrollo y refactorización he cometido pecados inconfesables y no hace falta se hagan públicos.


Detalles


El protocolo de Chain of Responsability es accept(command, [message], [...]) y la respuesta es (Bool:handled, Bool:error, String:result). Al final, Printer formatea y muestra según la respuesta.

Si se quisiera agregar un módulo, por ejemplo un algoritmo para SubtitutionCipher, habría que agregarlo colgando de él, quizás pasarle el Statistical y que devuelva un dictionary

Usé Chain of Responsability en lugar de Mediator pues tenía ganas de usar Chain of Responsability. Si hiciera falta pasar a Mediator, lo haría. Ganas pero no capricho.

Estas son las tablas de frecuencias en inglés sacadas de [practicalcryptography]

Frecuencia letras (asociada a f1)



E 12.1
T 8.94
A 8.55
O 7.47
I 7.33
N 7.17
S 6.73
R 6.33
H 4.96
L 4.21
D 3.87
C 3.16
U 2.68
M 2.53
F 2.18
G 2.09
P 2.07
W 1.83
Y 1.72
B 1.6
V 1.06
K 0.81
J 0.22
X 0.19
Z 0.11
Q 0.1

Frecuencia palabras (asociada a futura fw)


THE 6.42
OF 2.76
AND 2.75
TO 2.67
A 2.43
IN 2.31
IS 1.12
FOR 1.01
THAT 0.92
WAS 0.88
ON 0.78
WITH 0.75
HE 0.75
IT 0.74
AS 0.71
AT 0.58
HIS 0.55
BY 0.51
BE 0.48
ARE 0.47
FROM 0.47
THIS 0.42
I 0.41
BUT 0.4
HAVE 0.39
AN 0.37
HAS 0.35
NOT 0.34
THEY 0.33
OR 0.3

Frecuencia bigramas (asociada a f2)


TH 2.71
HE 2.33
IN 2.03
ER 1.78
AN 1.61
RE 1.41
ES 1.32
ON 1.32
ST 1.25
NT 1.17
EN 1.13
AT 1.12
ED 1.08
ND 1.07
TO 1.07
OR 1.06
EA 1
TI 0.99
AR 0.98
TE 0.98
NG 0.89
AL 0.88
IT 0.88
AS 0.87
IS 0.86
HA 0.83
ET 0.76
SE 0.73
OU 0.72
OF 0.71

Frecuencia trigamas (asociado a f3)


THE 1.81
AND 0.73
ING 0.72
ENT 0.42
ION 0.42
HER 0.36
FOR 0.34
THA 0.33
NTH 0.33
INT 0.32
ERE 0.31
TIO 0.31
TER 0.3
EST 0.28
ERS 0.28
ATI 0.26
HAT 0.26
ATE 0.25
ALL 0.25
HES 0.24
VER 0.24
HIS 0.24
ETH 0.24
OFT 0.22
ITH 0.21
FTH 0.21
STH 0.21
OTH 0.21
RES 0.21
ONT 0.2

Frecuencia primera letra de palabra (asociado a ffw)

t 16.671
a 11.602
s 7.755
h 7.232
w 6.753
i 6.286
o 6.264
b 4.702
m 4.383
f 3.779
c 3.511
l 2.705
d 2.67
p 2.545
n 2.365
e 2.007
g 1.95
r 1.653
y 1.62
u 1.487
v 0.649
j 0.597
k 0.59
q 0.173
z 0.034
x 0.017

Frecuencia de letras repetidas (asociada a futura fd)


LL
SS
EE
OO
TT
FF
RR
NN
PP
CC
MM
GG
DD
AA
BB

Próximos pasos

Que calcule las frecuencias de letras duplicadas.
Que calcule las frecuencias de palabras
Que calcule las frecuencias de la primera letra de cada palabra
Que calcule el patrón (véase próxima entrada en uno de estos días)

Referencias


[practicalcryptography] http://practicalcryptography.com/cryptanalysis/letter-frequencies-various-languages/english-letter-frequencies/

https://en.wikipedia.org/wiki/Letter_frequency

Frecuencia de letras repetidas y buena parte de mi instrucción tomadas de Secret History:  The Story of Cryptology - Craig P. Bauer

sábado, 21 de noviembre de 2015

Choco PI

Motivos: Seguridad, Educación y Bajo consumo


if you want an english version, feel free to ask me for it

Teniendo chicos hay tres caminos:

  • Permitir todo
  • Negar todo
  • Arremangarse


Lo normal es lo primero.

Mi impulso natural es el segundo.

Esta nota y alguna futura forman parte de lo que he hecho en el marco de lo tercero.

Aclaro que no soy pedagogo, esto es resultado de mi experiencia y sentido común.

Permitir todo


Es lo más sencillo. Mirá a tu alrededor y lo verás llevado a la práctica. Niños que no saben aún leer ni escribir manejando una tablet. Está ok, salvo que lo están haciendo en lugar de estar potrereando/andando en bici/patines/skate/pelota/trepar árboles/leer libros. Es la nueva tele.

Yo no estoy libre de pecado, de pequeño y no tanto pasé bastante tiempo jugando a los fichines o la Atari 130 XE, es que era un marginal.

Lo bueno es que aprenden a usar todo. Lo malo, es que a diferencia de los juegos de antes, ahora están conectados a Internet. Antes, cuando yo potrereaba, mis padres, tutores o encargados sabían lo que estaba haciendo pues lo habían hecho en su momento. Ahora, los niños estan "potrereando" en Internet, con adultos desconocidos ("no hables con extraños, no te subas al auto de un desconocido" -> "no chatees con extraños") y sus padres, tutores o encargados no tienen ni la menor idea, incluso hay algunos que ni siquiera potrerearon en el mundo real porque estaban mirando tele.

Negar todo


Lo segundo más fácil, mi impulso natural coherente con que el uso de mobile por menores en mi hogar despierta mi lado más paranóico, a tal punto que los aspectos educativos resultan perjudicados.

Ese es el problema, tampoco queremos analfabetos informáticos.

Un escenario común es "¿Podemos poner música?". Claro, siempre pueden y terminan mirando videos y de ahí está a un click jugar y es más fácil negar de una.

Arremangarse


Para no abandonarles en el ciberespacio ni negárselo, implantaré dos medidas: una, la del presente artículo, para reducir la interacción innecesaria con Internet y la otra, a futuro y en otra nota, la segmentación de la red y su monitoreo.

Puede parecer extremo, pero no tengo ganas de ser parte de una botnet. Tampoco quiero invadir su privacidad y estar mirando lo que hacen.


Teniendo un amplio y disponible almacén musical, ni hace falta pedir permiso y es sencillo restringir por contrato el acceso.


Aprovechando una Raspberry PI Model B, una caja plástica de bombones de chocolate, una adaptador usb/pata, un disco ide, un torno de mano, bastantes cds de música con sus correspondientes backups ripeados, es sólo pensar y trabajar un ratito para tener algo que permita escuchar música de algún modo.


No voy a entrar en detalles tipo instructables, pues las probabilidades de que tengas el mismo hardware que yo son bajísimas. Sólo mencionaré tips, recomendaciones y errores cometidos. Además asumo un conocimiento intermedio de administración linux, el objetivo de todo esto es estimular ideas para que te armes lo tuyo con lo que tengas.


Caminos no tomados


Quería aprovechar una SD Card de 2 GB, donde ya antes había instalado una distro para las pruebas con w3af [], pero el esfuerzo de achicar alguna distro para que entre, aunque traería aparejado un brutal incremento de conocimiento, excede el alcance y tiempo de este proyecto, al punto que es más barato comprar SD del tamaño necesario, 8 GB.

Instalar una distro específica de media center que hubiese permitido instarlar en tan sólo 1 GB estuvo considerado, pero tenía que aprender cosas específicas, mejor invertirlo en conocimiento genérico.


Detalles


La idea más completa es esta, pero no implementé todo:

+--------------+         +-------+       +--------+
| Amplificador <--audio--< RBpi  <-------> mpc    |
+------^-------+         | Music |       | ncmpc  |
       |                 | Player|       | android|
       +----------IR-----< Daemon|       +--------+
                         +-^---v-+       

                           |   |           +--------+  
  +------------------------v-+ \-streaming-> http   |
  |smb/sftp/rsync/nfs/webdav |             | client |
  +--------------------------+             +--------+
                                          


Gabinete


Esto es probablemente lo más interesante de esta entrada.

Al cortar el plástico hay que usar una velocidad mas bien baja y no cortar por mucho tiempo, ya que el plástico se calienta, derrite y pega a la herramienta. La década perdida, o más bien, las tres décadas perdidas es no haber tenido antes un dremel, ¡qué lo parió!










Es recomendable pensar bien como van los componentes. Yo me equivoqué con el conector de audio, pues cuando armé el gabinete no había terminado de pensar como lo iba a usar y así fue como tuve que usar un conector de audio a 90° y además tener que sacar la RBpi para poder conectarlo y desconectarlo.

Mas o menos lo pensé en función de los cables y la circulación de aire.



Administración general


Lo más cómodo me ha resultdo ssh -X, que me permite abrir synaptic para instalar lo que necesite. Sólo hace falta conectar a kvm en el primer arranque para configurar la red.



Temperatura

En invierno no hay problemas, pero en verano se puede complicar. El único termómetro disponible es el del disco rígido, pero sensors-detect no lo vé. Mala suerte.



Real Time Clock

Raspberry PI no tiene batería ni RTC, así que hay que configurar correctamente NTP, lo cual parece ok, sólo porque la configuración de la red permite que ChocoPI acceda a Internet. Mmmm, veremos.

Hay que configurar correctamente la TimeZone, ntp viene activo por default.


Green Energy

La mayor parte del tiempo esta máquina está en vano, pero no quiero que se esté prendiendo y apagando. De hecho tiene una RBPI para que tenga bajo consumo. El disco sí me interesaría que se apague cuando sé que va a estar varias horas si uso. Eso se hace con hdparm, pero me complica la vida tanto como prender y apagar todo, así que, otro skip.



Power off


En teoría apagar una máquina debería ser de las cosas mas sencillas, ¿no? Para los que no recuerdan o no estuvieron, hubo un tiempo en el cual había que "aparcar" los cabezales de los discos rígidos antes de apagarlos para evitar que pegaran contra las superficies. Tambien eran los tiempos en que para apagar lo único que había que hacer era... apagar. Ahora hay que avisarle al sistema operativo. Más que avisarle hay que pedirle.

Con este modelo nos quedamos con lo peor de las dos épocas: hay que pedirle al sistema operativo para que apague la RBPI y hay que apagar la fuente a mano, pues el disco rígido está conectado directamente a la fuente.

Aprovechando la capacidad de I/O de la RBPI habría que poner un relé o similar y algún circuitito, pero como la idea es que esté siempre prendida, tiene muy baja prioridad.


Control del amplificador


Uno de estos días, aprovechando los pines de la RBpi, no sé cómo, voy a controlar el amplificador via el remoto infra rojo.

Storage

Primero hay que descubrir dónde aparece el disco

[dmesg]
[    7.223291] scsi 0:0:0:0: Direct-Access     XXX XXXXX          PQ: 0 ANSI: 0
[    7.248541] sd 0:0:0:0: [sda] 488397168 512-byte logical blocks: (250 GB/232 GiB)
[    7.278569] sd 0:0:0:0: [sda] Write Protect is off
[    7.302157] sd 0:0:0:0: [sda] Mode Sense: 33 00 00 00
[    7.365556] sd 0:0:0:0: [sda] Attached SCSI disk


Luego particionarlo con fdisk, formatearlo con mkfs

sudo mkfs.ext4 /dev/sda1

actualizar fstab para que se automonte:


[/etc/fstab]
/dev/sda1       /mnt            ext4    rw,relatime,data=ordered 0 0

y por último copiarle la data, como mas te guste.

MPD

Es el programa que ejecuta los temas con una interfaz remota.

Puse todos sus archivos en el disco usb, /var/lib/mpd a la par de la música y ajusté acorde a la configuración. Ahí también va el streaming.



[/etc/mpd.conf]
music_directory     "/mnt/musica/"
playlist_directory  "/mnt/mpd/playlists"
db_file             "/mnt/mpd/tag_cache"
log_file            "/mnt/mpd/mpd.log"
pid_file            "/run/mpd/pid"
state_file          "/mnt/mpd/state"
sticker_file        "/mnt/mpd/sticker.sql"
user                "mpd"
audio_output {
    type            "alsa"
    name            "My ALSA Device"
}
audio_output {   
    type            "httpd"   
    name            "My HTTP Stream"
    encoder         "lame"    port        "8000"
    bitrate         "128"

    format          "44100:16:1"
}
filesystem_charset  "UTF-8"




File Sharing

Teniendo sshd, ya tenemos SFTP. Cuando tenga tiempo, ganas y necesidad, configuraré smb y nfs de algún modo relativamente seguro.


Sincronización


En mi master de audio, cada tanto ejecuto rsync. El sentido de la confianza indica que no pueda hacer pull desde ChocoPI, en quien confío menos que mi master. No olvidés ejecutar mpd update tras cualquier cambio.

Extensión para FF


Minion, en mi caso no toma el servidor asi que hay que

about:config -> extensions.mpm.server -> ip:port

pero no hay manera de decirle la contraseña.

Metadata


Al igual que cualquier otro player, toma la metadata del archivo, no le interesan los nombres de los archivos o las carpetas contenedoras, lo cual a mi me rompe mucho los pies, pues tengo un esquema muy sencillo:

letra
   nombre.grupo
      año - nombre album
         número - nombre tema

Lo cual no se lleva muy bien con compilados, disc1 y disc2,  ni música clásica.

Si la vida fuera fácil:

ls -1 "$1" | while read interprete; do
  ls -1 "$1/$interprete" | while read disco ; do
    anio=$(echo $disco | cut -d"-" -f 1)
    eldisco=$(echo $disco | cut -d"-" -f 2-)
    ls -1 "$1/$interprete/$disco" | while read tema; do
      pos=$(echo $tema | cut -d"-" -f 1)
      eltema=$(echo $tema | cut -d"-" -f 2)
        id3tool \

          --set-title="$eltema" \
          --set-album="$eldisco" \
          --set-artist="$interprete" \
          --set-year="$anio" \ 
          --set-track="$pos" \
          "$1/$interprete/$disco/$tema"
    done
  done
done


Pero como la vida no es fácil, es otro skip...

Seguridad


Apesta, es por ello que ni me he molestado aún en configurar smb, nfs, http o webdav. MPD tiene passwords, pero, wireshark dice que


OK MPD 0.19.0
status
ACK [4@0] {status} you don't have permission for "status"
password "password"
OK
status
volume: 85
repeat: 0
random: 0
single: 0
consume: 0
playlist: 2
playlistlength: 9
mixrampdb: 0.000000
state: stop
song: 0
songid: 1
nextsong: 1
nextsongid: 2
OK



No hay manera sencilla de corregir esto

 

Links útiles


http://www.musicpd.org/clients/ncmpc/

https://wiki.archlinux.org/index.php/Music_Player_Daemon/Tips_and_tricks

http://www.suntimebox.com/raspberry-pi-tutorial-course/week-3/day-5/

http://daker.me/2014/10/how-to-fix-perl-warning-setting-locale-failed-in-raspbian.html

http://www.musicpd.org/doc/user/

http://mpd.wikia.com/wiki/Music_Player_Daemon_Security