Algoritmo de criptografía Arc4

#!/usr/bin/python
# -*- coding: utf-8 -*-
# WEB blog.hackxcrack.es

class ARC4:
    S = []
    i = 0
    j = 0

    def inicializacion(self, k):
        S = range(256)
        j = 0
        for i in xrange(256):                       
            j = (j + S[i] + ord(k[i % len(k)])) % 256 
            S[i], S[j] = S[j], S[i]                  

        self.S = S

    def __init__(self, clave):
        self.inicializacion(clave)

    def siguienteByte(self):
        self.i = (self.i + 1) % 256 
        self.j = (self.j + self.S[self.i]) % 256
        self.S[self.i], self.S[self.j] = self.S[self.j], self.S[self.i]
        K = self.S[(self.S[self.i] + self.S[self.j]) % 256]
        print self.S[(self.S[self.i] + self.S[self.j]) % 256], # AL PONER LA , CAMBIAMOS IMPRESION DE VERTICAL A HORIZONTAL
        return K

    def cifra(self, texto):
        cifrado = []                              
        for caracter in texto:                    
            byte_texto = ord(caracter)            
            byte_clave = self.siguienteByte()     

            byte_cifrado = byte_texto ^ byte_clave   # XOR !

            caracter_cifrado = chr(byte_cifrado)  

            cifrado.append(caracter_cifrado)       

        return ''.join(cifrado)    

cifrador = ARC4("texto")         
mensaje = raw_input("Introduce mensaje para cifrar: ")

mensaje_cifrado = cifrador.cifra(mensaje)

print "El mensaje cifrado es: ", mensaje_cifrado

descifrador = ARC4("texto")  
mensaje_descifrado = descifrador.cifra(mensaje_cifrado)

print "El mensaje original es: ", mensaje_descifrado


Buscador completo en archivos de texto .txt

Este buscador localiza por líneas de texto en archivos .txt

#!/usr/bin/python
#
# BUSCADOR. EFECTUA LAS MISMAS OPERACIONES QUE grep EN bash-shell.  
# TE PIDE HASTA CUATRO PATRONES Y TE LOCALIZA 
# LA LINEA QUE CONTENGA LOS QUE LE DES -DE 1 A LOS 4-.
# LE PUEDES PEDIR UNO O DOS Y NO TE DA NINGUN ERROR. 
# TE BUSCA INCLUSO SUBCADENAS (amador = ama)  
print
print "Buscador. Puedes introducir hasta 4 parametros de busqueda y subcadenas."
print

archivo_de_texto = open(raw_input("Introduce el fichero con extension: "),"r") 

# PATRONES DE BUSQUEDA. SI NO INTRODUCIMOS NINGUN PATRON, 
# NOS LISTARA EL ARCHIVO COMPLETO.  

a = raw_input("Patron 1: ")
b = raw_input("Patron 2: ")
c = raw_input("Patron 3: ")
d = raw_input("Patron 4: ")


for linea in archivo_de_texto:
    if a in linea:
        if b in linea:
            if c in linea:
                if d in linea: 
                    print linea

Imaginemos un archivo de texto con el siguiente contenido:

1 juan martinez perez fontanero 636 disponible madrid

2 pedro lopez saez albañil 434 disponible logroño

3 alberto sanchez fiz electricista 555 no disponible barcelona

4 roberto mendez enlosador 778 no disponible sevilla

Pues bien, si nosotros quisieramos buscar que trabajadores «no están disponibles» y cuales de ellos viven en «Sevilla», introduciríamos los dos parámetros a buscar y nos daría el resultado

Si introducimos los parámetros de búsqueda «no disponible» y «sevilla» inmediatamente nos llevaría a «4 roberto mendez enlosador…»

Plantilla Excel completísima de horas de trabajo en uno, dos y hasta tres turnos de mañana, tarde y noche.

La siguiente plantilla es un libro completísimo de Excel de contabilización de horas de trabajo y nómina del trabajador. Se compone a una plantilla donde se pueden hacer hasta tres turnos -mañana, tarde y noche- y lo contabiliza absolutamente todo, incluso dietas, comidas, viajes, etc… Conforme al horario que introduzcamos, nos dará el horario normal, las horas extras, si éstas son por la mañana, tarde, noche, sábados, etc… Fue un trabajo que llevó cerca de dos meses dedicándole muchas horas para que no hubiese ningún error. Lo comparto para que hagáis buen uso de ella. «El conocimiento humano pertenece al mundo».

Juego del ahorcado en Bash/Shell.

Este es el típico juego del ahorcado en Bash. Tú le pones la palabra con la que quieres jugar. Está muy bien hecho y divertido.

 #!/bin/bash
 # FUNCIONA PERFECTAMENTE
 # Autores: Jorge Blanco De Gracia & Pablo Morata López &  Daniel G. Trabada
 # Licencia : GPL v3
 '
     _____
    |   \|
    |    |
    |    |
         |
         |
 ________|____
 
 
    _____
    |   \|
    |    |
   O|O   | ALERTA. HAS COMETIDO UN ERROR. YA NO TIENES CABEZA.
         |
         |
 ________|____
 
    
    _____
    |   \|
    |    |
   O|O   |
  //     | ALERTA 2. HAS COMETIDO DOS ERRORES. YA NO TIENES BRAZO.
         |
 ________|____
 
 
    _____
    |   \|
    |    |
   O|O   |
  // \\  | ALERTA 3. HAS COMETIDO TRES ERRORES. TE HAS QUEDADO SIN DOS BRAZOS.
         |
 ________|____
 
 
    _____
    |   \|
    |    |
   O|O   |
  // \\  |
  ||     | ALERTA 4. HAS COMETIDO CUATRO ERRORES. SOLO TE QUEDA UNA PIERNA. SI FALLAS UNA VEZ MAS, PIERDES.
 ________|____
 
 
 BUSCALO EN GOOGLE. SI LO ENCUENTRAS, AVISA.
     _____
    |   \|
    |    |
   O|O   |
  // \\  |
  || ||  | ERES TONTO DEL CULO. YA NO HAY ALERTAS. HAS PERDIDO.
 ________|____
 '
 
 clear
 echo -n "¿QUE PALABRA VAMOS A ADIVINAR?: "
 read word
 echo
# echo "Pulsa enter para continuar..."
# read continuar
 clear
 letra="*"   
 
 fallos=5 
 
 letras=`echo $word | sed "s/[^${letra}]/*"/g` #MOSTRAMOS LOS CARACTERES DE LA PALABRA SUSTITUIDOS POR * -ASTERISCO-
 
 sust=$letras
 
 while [ "$sust" != "$word" ]       #MIENTRAS TODOS LOS CARACTERES NO SEAN IGUALES A LA PALABRA...
 
       do
 #        clear
 	  echo
          echo "LAS LETRAS SON $sust"
          echo
          sed -n "$fallos,$((fallos+7))p" $0
 	  echo 
 	  echo LETRAS INTRODUCIDAS HASTA AHORA: $a
 	  echo 	
 	  echo -n "INTRODUCE UNA LETRA: "
          read letra
 	  a=${a}$letra
 	  palabra=${letra}$palabra    #CONCATENA LAS LETRAS QUE METEMOS CON LAS QUE HAY YA INTRODUCIDAS	
 			
          echo
          existe=`echo ${word} | grep ${letra}` #COMPARA, Y SI NO SON IGUALES, NO MUESTRA NADA
 
               if [ "$existe" = "" ]
                  then
 	             echo "OOOOOH NO ES CORRECTO. BUSCALO EN GOOGLE - ${letra} - NO APARECE EN LA PALABRA OCULTA"
 		     error=$((error + 1))
                     if [ $error = 5 ]
                        then
 #	                   clear
 		 	   fallos=$(($fallos+9))
 			   sed -n "$fallos,$((fallos+7))p" $0
 			   echo "HAS COMETIDO $error ERRORES. ESTAS MUERTO"
                           echo
			   echo	
			   exit
                        else
                           if [ $error = 1 ]
                              then
                                 echo "HAS COMETIDO $error ERROR"
 			         fallos=$(($fallos+9))
                              else
 			         fallos=$(($fallos+9))		
                           fi
                     fi
 
 		  else
                     sust=`echo $word | sed "s/[^${palabra}]/*"/g` #SUSTITUYE LAS LETRAS POR LOS * ASTERISCOS
               fi
 
                  if [ "${sust}" = "${word}" ] #SI SON IGUALES
                     then
                        echo "ENHORABUENA. HAS DESCUBIERTO LA PALABRA SECRETA. LA MISMA ES: ${word}."
                	echo
 			echo	
                  fi
 
       done


Calculadora de Máximo Común Divisor de dos números. Útil para criptografía.

Dos números son coprimos o primos entre sí cuando no tienen divisores en común (excepto 1 y -1). Por tanto, la manera de saber si dos números son coprimos es ver sus divisores. Si hay algún divisor en común entre los dos números además del 1, los números no son coprimos y si no existen, sí son coprimos.

También sabemos que el máximo común divisor de dos números coprimos es siempre 1. Por lo que también tenemos otra manera de saber cuando dos números son coprimos mirando su MCD.

MCD (A, B) = 1 ==> ENTONCES A Y B SON COPRIMOS

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# CALCULADORA M.C.D DE DOS NUMEROS. UTIL PARA CRIPTOGRAFIA, CIFRADO RSA. 
# TRABAJAMOS CON DOS FUNCIONES
print
print "Calculadora de numeros coprimos o primos relativos entre si"
print 

# DEFINIMOS LA PRIMERA FUNCION

x = input("Introduce el primer numero: ")   # INTRODUCIMOS LOS DOS NUMEROS A COMPROBAR
y = input("Introduce el segundo numero: ")

def mcd(a, b):
    if b == 0: 
        return a
    else:
        return mcd(b, a%b) 

#print mcd(x, y) 

print
print "El Maximo Comun Divisor de ", x, "y ", y," es: ", mcd(x, y) 
print

if mcd(x, y) == 1: 
    print "Los numeros SON coprimos o primos relativos entre si"
else:
    print "Los numeros NO SON coprimos entre si"
print 

# SEGUNDA FUNCION 

def mcd(a, b):
    resto = 0
    while(b > 0):
        resto = b
        b = a % b
        a = resto 
    return a

num1 = int(input("Introduce el primer numero: ")) 
num2 = int(input("Introduce el segundo numero: ")) 

print 
print "El Maximo Comun Divisor de ", num1, " y " , num2, " es: ", mcd(num1, num2) 
print
if mcd(num1 ,num2) == 1: 
    print "Los números SON coprimos o primos relativos entre si"
else: 
    print "Los números NO SON coprimos entre si" 
print


Presentamos un script con dos funciones que hayan el Máximo Común Divisor de dos números. Nos pedirá que ingresemos dos números.

Si por ejemplo, ingresamos los números 1 y 7 nos dirá que SON COPRIMOS o PRIMOS RELATIVOS ENTRE SÍ, ya que 1 y 7 solo son divisibles por 1.

Si ingresamos los números 9 y 27 nos dirá que los números NO SON COPRIMOS ya que 9 y 27 son divisibles también por el número 9.

Si ingresásemos los números 3 y 15 nos diría que NO SON COPRIMOS ya que ambos se pueden dividir por 3.

Script que imprime el siguiente segundo de una hora previamente dada

Este programilla es bastante simple. Lo único que hace es imprimir el siguiente segundo de una hora dada. El script nos pide una hora y nos imprimirá esa misma hora en el siguiente segundo.

#!/usr/bin/python
#
# ESTE PROGRAMA IMPRIME LA HORA CORRESPONDIENTE 
# AL SIGUIENTE SEGUNDO. PARA LA ENTRADA 13,43,24 
# TIENE QUE DEVOLVER 13,43,25.

# PEDIMOS DATOS
tiempo=raw_input("Introduce la hora con el siguiente formato: 00,00,00: ")

# OBTENEMOS DATOS
aux = tiempo.split(",")
horas = int(aux[0])
minutos = int(aux[1])
segundos = int(aux[2])

# AUMENTAMOS UN SEGUNDO
segundos += 1

# CASOS
if segundos != 60: 
    tiempo = (horas, minutos, segundos)
else: 
    if minutos == 59 and horas == 23:
        tiempo = (0, 0, 0)
    else:
        if minutos == 59:
            tiempo = (horas + 1, 0, 0)
        else: 
            tiempo = (horas, minutos + 1, 0)

# IMPRIMIMOS EL RESULTADO (UNA TUPLA)
print tiempo

Dada la hora 13,43,24 nos imprimiría una tupla con los valores (13,43,25).

Ficheros CSV separados por comas

Vamos a ver desde la introducción de datos en los referidos ficheros hasta varias formas de leer los mismos.

Empezaremos creando el fichero.

#!/usr/bin/python
#
# Nos crea un fichero -csv-. Introducimos fichero y extension
#
fichero_nuevo = raw_input("Introduce el nombre y la extension del fichero a crear: ")
archivo = open(fichero_nuevo, "w")
print "El archivo se ha creado correctamente"
archivo.close
print 
La salida sería: 
Introduce el nombre y la extension del fichero a crear: fichero_nuevo.csv
El archivo se ha creado correctamente. 
Si hacemos un listado de ficheros del directorio (ls -l) nos damos cuenta de que
ha creado el fichero "fichero_nuevo.csv"

Una vez creado el fichero, vamos  a introducir datos

Creamos un script para ello.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
pregunta = raw_input("Desea Introducir Datos [s/n]: ")

while pregunta == "s":

    archivo = open("fichero_nuevo.csv", "a") 

    factura = raw_input("Introduce Factura: ")
    producto = raw_input("Introduce Producto: ")
    cantidad = raw_input("Introduce Cantidad: ")
    precio = raw_input("Introduce Precio: ")
    peso = raw_input("Introduce Peso: ")
    ano = raw_input("Introduce Ano: ")

    archivo.write(factura)
    archivo.write(",")    
    archivo.write(producto)
    archivo.write(",")
    archivo.write(cantidad)
    archivo.write(",")
    archivo.write(precio)
    archivo.write(",")
    archivo.write(peso)
    archivo.write(",")
    archivo.write(ano)
    archivo.write("\n")   

    archivo.close()

    pregunta = raw_input("Desea seguir Introduciendo Datos [s/n]: ")

print "Adios"
print 

Una vez introducidos los datos, vamos a leerlos de varias formas, según nos interese para hacer un tipo de algoritmo u otro.

#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Nos lee todo el archivo como si hicieses un -cat-"
print

with open("fichero_nuevo.csv", "r") as archivo:
    print archivo.read()
print 
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Lee cada fila del archivo EN FORMA DE LISTA y separada por comas"
print

with open("fichero_nuevo.csv", "r") as archivo:
    lineas = archivo.read().splitlines()
    print lineas
print
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Lee cada fila del archivo separada por comas MENOS EL ENCABEZAMIENTO"
print

with open("fichero_nuevo.csv", "r") as archivo:
    lineas = archivo.read().splitlines()
    lineas.pop(0)   # ESTA LINEA ES PARA NO IMPRIMIR EL ENCABEZAMIENTO (LA PRIMERA LINEA)
    print lineas
print
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Lee cada fila del archivo separada por comas EN FORMA DE LISTA"
print

with open("fichero_nuevo.csv", "r") as archivo:
    lineas = archivo.read().splitlines()
    lineas.pop(0)    # NO IMPRIMIR EL ENCABEZAMIENTO
    for l in lineas:
        linea = l.split(",")  
        print linea
print
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Lee de varias formas. Elegimos dos o tres columnas del archivo (con indices), por ejemplo Cantidad, Precio, Peso, etc. y te lee las columnas elegidas EN FORMA DE LISTA y modo normal o decimales, MENOS EL ENCABEZAMIENTO."
print

datos = []
datos1 = []
datos2 = []
datos3 = []

with open("fichero_nuevo", "r") as archivo:
    lineas = archivo.read().splitlines()
    lineas.pop(0)  
    for l in lineas:
        linea = l.split(",")   
        datos.append([float(linea[2]), float(linea[3])])    # PONGO -float- PORQUE QUIERO LEER DECIMALES

        datos1.append([(linea[1]), (linea[2]), (linea[3])])  
        datos2.append([(linea[1]), float(linea[2]), float(linea[3])])  # LEE LISTA Y DECIMALES

        datos3.append([(linea[0]), float(linea[2]), (linea[3]), float(linea[4])])

print "Leera una lista de dos columnas con decimales"
print datos
print "Leera una lista de tres columnas sin decimales"
print datos1
print "Leera una lista de tres columnas sin y con decimales"
print datos2
print "Leera una lista de cuatro columnas - sin - con - sin - con - decimales"
print datos3
print 
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Lee las dos columnas elegidas (Cantidad y Precio)  en forma de lista normal y ordenadas CON DECIMALES. NO LEE ENCABEZAMIENTO."
print

datos = []

with open("fichero_nuevo.csv", "r") as archivo:
    lineas = archivo.read().splitlines()
    lineas.pop(0)   
    for l in lineas:
        linea = l.split(",")  
        datos.append([float(linea[2]), float(linea[3])])  
x = []
y = []
for elem in (datos):       # LEE DE MANERA NORMAL
    x.append(elem[0])
    y.append(elem[1])

print "Leera de manera desordenada"
print x
print y

a = []
b = []
for elem in sorted(datos):   # LA ORDEN -sorted- ORDENA DE MENOR A MAYOR
    a.append(elem[0])
    b.append(elem[1])

print "Leera de manera ordenada"
print a
print b
print 
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Trabajo con -csv.reader- y -delimiter-. Lee columnas -Producto- y -Precio-."
print "Lee el archivo con el modulo -csv- y lo imprime en forma de texto normal"
print

import csv

with open("fichero_nuevo.csv", "r") as file:
#    reader = csv.reader(file)  # NOS LEE LA TOTALIDAD DEL ARCHIVO
    reader = csv.reader(file, delimiter = ',')  
    for row in reader:
        print row  # LEE ARCHIVO FORMA DE LISTA CON SUS COLUMNAS
        print row[0]   # LEE ARCHIVO CON SI FUERA CON -cat-
        print row[1]   # LEE COLUMNA 2 INDICE 1
        print row[1],row[3]
        print row[1],'-',row[3]
print 
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Trabajo con -csv-reader-, -delimiter-, -quotechar- y -quoting-. Lee -Producto- y -Cantidad-."
print "Lee archivo con el modulo -csv- e imprime las filas que indico en forma normal."
print

import csv

with open("fichero_nuevo.csv", "r") as file:
    reader = csv.reader(file, delimiter=',', quotechar=',', quoting=csv.QUOTE_MINIMAL)
    for row in reader:
        print row[0]  # LEE LA COLUMNA 1 INDICE 0
        print row[1]  # IMPRIME COLUMNA 2 INDICE 1
        print row[2]  # IMPRIME COLUMNA 3 INDICE 2
        print row[2],row[3] # IMPRIME LAS DOS COLUMNAS INDICADAS
        print row[2],['-']  # IMPRIME INDICE 2 CON CORCHETES Y RAYA
        print row[1],'-',row[2] 
print 
#!/usr/bin/python
# -*- coding: utf-8 -*- 
print
print "Trabajo con -DictReader- y -delimiter-. Delimitamos columnas por nombre en lugar de indice."
print "Lee el archivo e imprime las columnas -Factura-, -Producto-, -Cantidad- y -Año-."
print

import csv

with open("fichero_nuevo.csv") as csvfile:
    reader = csv.DictReader(csvfile, delimiter = ',')  
    for row in reader:
#        print row['Factura']  # LEERA LA COLUMNA FACTURA
        print row['Factura'],'-',row['Producto'],'-',row['Cantidad'],'-',row['Ano']
print
#!/usr/bin/python
#
# NORMALMENTE FUNCIONA BIEN PERO A VECES FALLA, CREO POR EL ANCHO DE COLUMNA SEGUN EL DATO QUE METAS.
# MUCHO CUIDADO EN LAS DELIMITACIONES. SI HAS DELIMITADO TU ARCHIVO -csv- MEDIANTE (-;-) TU -delimiter- DEBERA INDICAR (-;-)
# SI LO HAS HECHO POR COMAS (-,-) EL -delimiter- DEBERA SER COMA.
print
print "Lee el archivo tabuladamente."
print

import csv

archivo = open("fichero_nuevo.csv", "rb")   
leer_archivo = csv.reader(archivo, delimiter=',')  

for fila in leer_archivo:
    print ("\t ".join(fila))    # IR PROBANDO CON LA TABULACION
    print ("  \t ".join(fila))   
    print ("  \t  ".join(fila)) # ESTA PARECE BUENA
    print ("  \t "" \t ".join(fila))  
archivo.close()

# COMO HE DICHO, DEPENDE DEL ANCHO DE LOS DATOS QUE METAS EN LAS CASILLAS

Estas son diversas formas de leer ficheros csv, desde las mas simples hasta algunas un poco mas complejas. Ya cada uno debe elegir la que se adapte a sus necesidades.

Teorema de Pitágoras

Pequeño script que te haya la hipotenusa de un triángulo. 

#!/bin/bash
#
#
echo TEOREMA DE PITAGORAS
echo ====================
echo INTRODUCE EL CATETO A
read a
echo INTRODUCE EL CATETO B
read b
c=$(echo "sqrt($a^2 + $b^2)" |bc -l)
echo 
echo LA HIPOTENUSA VALE $c

La salida sería: 

TEOREMA DE PITAGORAS
INTRODUCE EL CATETO A
4
INTRODUCE EL CATETO B
5
LA HIPOTENUSA VALE:  6.40312423743284868648

Función (Case – Esac) en Bash

Script muy sencillo que nos explica los comandos -case- y -esac- para elegir entre una variedad de opciones. 

#!/bin/bash
#
#   EL SCRIPT SIMPLEMENTE NOS EXPLICA LA FUNCION DE -CASE- Y NOS DA A ELEGIR UNA OPCION.
#

alumnos()
{
echo "\n\n ********ALUMNOS*********"
sleep 2
exit
}

asignaturas()
{
echo "\n\n ********ASIGNATURAS*******"
sleep 2
exit
}

calificaciones()
{
echo "\n\n *******CALIFICACIONES********"
sleep 2
exit
}

docentes()
{
echo "\n\n ********DOCENTES***********"
sleep 2
exit
}

echo "ESCUELA DE ESTUDIOS MATEMATICOS"
echo
echo "1) Docentes"
echo "2) Alumnos"
echo "3) Asignaturas"
echo "4) Calificaciones"
echo "5) Salir"
echo
echo -n "INGRESE UNA OPCION:"

#read opcion

a=0                      
while [ $a != 1 ]        
do

read opcion

case $opcion in          # PRINCIPIO DE LA ESTRUCTURA -CASE-
  1) docentes
;;
  2) alumnos
;;
  3) asignaturas
;;
  4) calificaciones
;;
  5) echo "SALIENDO"
sleep 3                 # TIEMPO DE REACCION
exit                    # SALIDA DEL BUCLE
;;
  *) echo -n "LA OPCION NO ES VALIDA"
#
a=0
#
;;
esac                     # FIN DE LA ESTRUCTURA -ESAC-
done
La salida sería: 
ESCUELA DE MATEMATICAS
1) Docentes
2) Alumnos
3) Asignaturas
4) Calificaciones
5) Salir
INGRESE UNA OPCION: (Ingresamos p.ej. la opcion 1) 
\n\n DOCENTES***