spechal.com | [spesh-uhl]

CAT | Python

432 views
Dec/09

30

Python Beale Cipher Decoder

Here is a slimmed down version of my PHP Beale Cipher Decoder script using Python.  Usage is pretty straight forward.

#
#   Beale Decoder using Python
#   Copyright 2009 Travis Crowder
#   Published under the MIT License
#

class Beale(object):

    def __init__(self):
        self.__ciphers = []
        self.__ciphers.append([71, 194, 38, 1701, 89, 76, 11, 83, 1629, 48, 94, 63, 132, 16, 111,
                95, 84, 341, 975,14, 40, 64, 27, 81, 139, 213, 63, 90, 1120, 8, 15,
                3, 126, 2018, 40, 74, 758, 485,604, 230, 436, 664, 582, 150, 251,
                284, 308, 231, 124, 211, 486, 225, 401, 370,11, 101, 305, 139, 189,
                17, 33, 88, 208, 193, 145, 1, 94, 73, 416, 918, 263, 28, 500,538,
                356, 117, 136, 219, 27, 176, 130, 10, 460, 25, 485, 18, 436, 65,
                84, 200, 283,118, 320, 138, 36, 416, 280, 15, 71, 224, 961, 44, 16,
                401, 39, 88, 61, 304, 12, 21,24, 283, 134, 92, 63, 246, 486, 682,
                7, 219, 184, 360, 780, 18, 64, 463, 474, 131,160, 79, 73, 440, 95,
                18, 64, 581, 34, 69, 128, 367, 460, 17, 81, 12, 103, 820, 62,116,
                97, 103, 862, 70, 60, 1317, 471, 540, 208, 121, 890, 346, 36, 150,
                59, 568,614, 13, 120, 63, 219, 812, 2160, 1780, 99, 35, 18, 21,
                136, 872, 15, 28, 170, 88, 4,30, 44, 112, 18, 147, 436, 195, 320,
                37, 122, 113, 6, 140, 8, 120, 305, 42, 58, 461,44, 106, 301, 13,
                408, 680, 93, 86, 116, 530, 82, 568, 9, 102, 38, 416, 89, 71, 216,
                728, 965, 818, 2, 38, 121, 195, 14, 326, 148, 234, 18, 55, 131,
                234, 361, 824, 5,81, 623, 48, 961, 19, 26, 33, 10, 1101, 365, 92,
                88, 181, 275, 346, 201, 206, 86,36, 219, 324, 829, 840, 64, 326,
                19, 48, 122, 85, 216, 284, 919, 861, 326, 985,233, 64, 68, 232,
                431, 960, 50, 29, 81, 216, 321, 603, 14, 612, 81, 360, 36, 51, 62,
                194, 78, 60, 200, 314, 676, 112, 4, 28, 18, 61, 136, 247, 819, 921,
                1060, 464, 895,10, 6, 66, 119, 38, 41, 49, 602, 423, 962, 302, 294,
                875, 78, 14, 23, 111, 109, 62,31, 501, 823, 216, 280, 34, 24, 150,
                1000, 162, 286, 19, 21, 17, 340, 19, 242, 31,86, 234, 140, 607,
                115, 33, 191, 67, 104, 86, 52, 88, 16, 80, 121, 67, 95, 122, 216,
                548, 96, 11, 201, 77, 364, 218, 65, 667, 890, 236, 154, 211, 10,
                98, 34, 119, 56,216, 119, 71, 218, 1164, 1496, 1817, 51, 39, 210,
                36, 3, 19, 540, 232, 22, 141, 617,84, 290, 80, 46, 207, 411, 150,
                29, 38, 46, 172, 85, 194, 39, 261, 543, 897, 624, 18,212, 416, 127,
                931, 19, 4, 63, 96, 12, 101, 418, 16, 140, 230, 460, 538, 19, 27,
                88,612, 1431, 90, 716, 275, 74, 83, 11, 426, 89, 72, 84, 1300,
                1706, 814, 221, 132,40, 102, 34, 868, 975, 1101, 84, 16, 79, 23,
                16, 81, 122, 324, 403, 912, 227, 936,447, 55, 86, 34, 43, 212, 107,
                96, 314, 264, 1065, 323, 428, 601, 203, 124, 95, 216,814, 2906,
                654, 820, 2, 301, 112, 176, 213, 71, 87, 96, 202, 35, 10, 2, 41,
                17, 84,221, 736, 820, 214, 11, 60, 760])
        self.__ciphers.append([115, 73, 24, 807, 37, 52, 49, 17, 31, 62, 647, 22, 7, 15, 140, 47,
               29, 107, 79, 84, 56, 239, 10, 26, 811, 5, 196, 308, 85, 52, 160,
               136, 59, 211, 36, 9, 46, 316, 554, 122, 106, 95, 53, 58, 2, 42, 7,
               35, 122, 53, 31, 82, 77, 250, 196, 56, 96, 118, 71, 140, 287, 28,
               353, 37, 1005, 65, 147, 807, 24, 3, 8, 12, 47, 43, 59, 807, 45, 316,
               101, 41, 78, 154, 1005, 122, 138, 191, 16, 77, 49, 102, 57, 72, 34,
               73, 85, 35, 371, 59, 196, 81, 92, 191, 106, 273, 60, 394, 620, 270,
               220, 106, 388, 287, 63, 3, 191, 122, 43,  234, 400, 106, 290, 314,
               47, 48, 81, 96, 26, 115, 92, 158, 191, 110, 77, 85, 197, 46, 10,
               113, 140, 353, 48, 120, 106, 2, 607, 61, 420, 811, 29, 125, 14, 20,
               37, 105, 28, 248, 16, 159, 7, 35, 19, 301, 125, 110, 486, 287, 98,
               117, 511, 62, 51, 220, 37, 113, 140, 807, 138, 540, 8, 44, 287, 388,
               117, 18, 79, 344, 34, 20, 59, 511, 548, 107, 603, 220, 7, 66, 154,
               41, 20, 50, 6, 575, 122, 154, 248, 110, 61, 52, 33, 30, 5, 38, 8,
               14, 84, 57, 540, 217, 115, 71, 29, 84, 63, 43, 131, 29, 138, 47, 73,
               239, 540, 52, 53, 79, 118, 51, 44, 63, 196, 12, 239, 112, 3, 49, 79,
               353, 105, 56, 371, 557, 211, 515, 125, 360, 133, 143, 101, 15, 284,
               540, 252, 14, 205, 140, 344, 26, 811, 138, 115, 48, 73, 34, 205,
               316, 607, 63, 220, 7, 52, 150, 44, 52, 16, 40, 37, 158, 807, 37,
               121, 12, 95, 10, 15, 35, 12, 131, 62, 115, 102, 807, 49, 53, 135,
               138, 30, 31, 62, 67, 41,  85, 63, 10, 106, 807, 138, 8, 113, 20, 32,
               33, 37, 353, 287, 140, 47, 85, 50, 37, 49, 47, 64, 6, 7, 71, 33, 4,
               43, 47, 63, 1, 27, 600, 208, 230, 15, 191, 246, 85, 94, 511, 2270,
               20, 39, 7, 33, 44, 22, 40, 7, 10, 3, 811, 106, 44, 486, 230, 353,
               211, 200, 31, 10, 38, 140, 297, 61, 603, 320, 302, 666, 287, 2, 44,
               33, 32, 511, 548, 10, 6, 250, 557, 246, 53, 37, 52, 83, 47, 320, 38,
               33, 807, 7, 44, 30, 31, 250, 10, 15, 35, 106, 160, 113, 31, 102,
               406, 230, 540, 320, 29, 66, 33, 101, 807, 138, 301, 316, 353, 320,
               220, 37, 52, 28, 540, 320, 33, 8, 48, 107, 50, 811, 7, 2, 113, 73,
               16, 125, 11, 110, 67, 102, 807, 33, 59, 81, 158, 38, 43, 581, 138,
               19, 85, 400, 38, 43, 77, 14, 27, 8, 47, 138, 63, 140, 44, 35, 22,
               177, 106, 250, 314, 217, 2, 10, 7, 1005, 4, 20, 25, 44, 48, 7, 26,
               46, 110, 230, 807, 191, 34, 112, 147, 44, 110, 121, 125, 96, 41, 51,
               50, 140, 56, 47, 152, 540, 63, 807, 28, 42, 250, 138, 582, 98, 643,
               32, 107, 140, 112, 26, 85, 138, 540, 53, 20, 125, 371, 38, 36, 10,
               52, 118, 136, 102, 420, 150, 112, 71, 14, 20, 7, 24, 18, 12, 807,
               37, 67, 110, 62, 33, 21, 95, 220, 511, 102, 811, 30, 83, 84, 305,
               620, 15, 2, 108, 220, 106, 353, 105, 106, 60, 275, 72, 8, 50, 205,
               185, 112, 125, 540, 65, 106, 807, 188, 96, 110, 16, 73, 33, 807,
               150, 409, 400, 50, 154, 285, 96, 106, 316, 270, 205, 101, 811, 400,
               8, 44, 37, 52, 40, 241, 34, 205, 38, 16, 46, 47, 85, 24, 44, 15, 64,
               73, 138, 807, 85, 78, 110, 33, 420, 505, 53, 37, 38, 22, 31, 10,
               110, 106, 101, 140, 15, 38, 3, 5, 44, 7, 98, 287, 135, 150, 96, 33,
               84, 125, 807, 191, 96, 511, 118, 440, 370, 643, 466, 106, 41, 107,
               603, 220, 275, 30, 150, 105, 49, 53, 287, 250, 208, 134, 7, 53, 12,
               47, 85, 63, 138, 110, 21, 112, 140, 485, 486, 505, 14, 73, 84, 575,
               1005, 150, 200, 16, 42, 5, 4, 25, 42, 8, 16, 811, 125, 160, 32, 205,
               603, 807, 81, 96, 405, 41, 600, 136, 14, 20, 28, 26, 353, 302, 246,
               8, 131, 160, 140, 84, 440, 42, 16, 811, 40, 67, 101, 102, 194, 138,
               205, 51, 63, 241, 540, 122, 8, 10, 63, 140, 47, 48, 140, 288])
        self.__ciphers.append([317, 8, 92, 73, 112, 89, 67, 318, 28, 96, 107, 41, 631, 78, 146,
                397, 118, 98, 114, 246, 348, 116, 74, 88, 12, 65, 32, 14, 81, 19,
                76, 121, 216, 85, 33, 66, 15, 108, 68, 77, 43, 24, 122, 96, 117, 36,
                211, 301, 15, 44, 11, 46, 89, 18, 136, 68, 317, 28, 90, 82, 304, 71,
                43, 221, 198, 176, 310, 319, 81, 99, 264, 380, 56, 37, 319, 2, 44,
                53, 28, 44, 75, 98, 102, 37, 85, 107, 117, 64, 88, 136, 48, 154, 99,
                175, 89, 315, 326, 78, 96, 214, 218, 311, 43, 89, 51, 90, 75, 128,
                96, 33, 28, 103, 84, 65, 26, 41, 246, 84, 270, 98, 116, 32, 59, 74,
                66, 69, 240, 15, 8, 121, 20, 77, 89, 31, 11, 106, 81, 191, 224, 328,
                18, 75, 52, 82, 117, 201, 39, 23, 217, 27, 21, 84, 35, 54, 109, 128,
                49, 77, 88, 1, 81, 217, 64, 55, 83, 116, 251, 269, 311, 96, 54, 32,
                120, 18, 132, 102, 219, 211, 84, 150, 219, 275, 312, 64, 10, 106,
                87, 75, 47, 21, 29, 37, 81, 44, 18, 126, 115, 132, 160, 181, 203,
                76, 81, 299, 314, 337, 351, 96, 11, 28, 97, 318, 238, 106, 24, 93,
                3, 19, 17, 26, 60, 73, 88, 14, 126, 138, 234, 286, 297, 321, 365,
                264, 19, 22, 84, 56, 107, 98, 123, 111, 214, 136, 7, 33, 45, 40, 13,
                28, 46, 42, 107, 196, 227, 344, 198, 203, 247, 116, 19, 8, 212, 230,
                31, 6, 328, 65, 48, 52, 59, 41, 122, 33, 117, 11, 18, 25, 71, 36,
                45, 83, 76, 89, 92, 31, 65, 70, 83, 96, 27, 33, 44, 50, 61, 24, 112,
                136, 149, 176, 180, 194, 143, 171, 205, 296, 87, 12, 44, 51, 89, 98,
                34, 41, 208, 173, 66, 9, 35, 16, 95, 8, 113, 175, 90, 56, 203, 19,
                177, 183, 206, 157, 200, 218, 260, 291, 305, 618, 951, 320, 18, 124,
                78, 65, 19, 32, 124, 48, 53, 57, 84, 96, 207, 244, 66, 82, 119, 71,
                11, 86, 77, 213, 54, 82, 316, 245, 303, 86, 97, 106, 212, 18, 37,
                15, 81, 89, 16, 7, 81, 39, 96, 14, 43, 216, 118, 29, 55, 109, 136,
                172, 213, 64, 8, 227, 304, 611, 221, 364, 819, 375, 128, 296, 1, 18,
                53, 76, 10, 15, 23, 19, 71, 84, 120, 134, 66, 73, 89, 96, 230, 48,
                77, 26, 101, 127, 936, 218, 439, 178, 171, 61, 226, 313, 215, 102,
                18, 167, 262, 114, 218, 66, 59, 48, 27, 19, 13, 82, 48, 162, 119,
                34, 127, 139, 34, 128, 129, 74, 63, 120, 11, 54, 61, 73, 92, 180,
                66, 75, 101, 124, 265, 89, 96, 126, 274, 896, 917, 434, 461, 235,
                890, 312, 413, 328, 381, 96, 105, 217, 66, 118, 22, 77, 64, 42, 12,
                7, 55, 24, 83, 67, 97, 109, 121, 135, 181, 203, 219, 228, 256, 21,
                34, 77, 319, 374, 382, 675, 684, 717, 864, 203, 4, 18, 92, 16, 63,
                82, 22, 46, 55, 69, 74, 112, 134, 186, 175, 119, 213, 416, 312, 343,
                264, 119, 186, 218, 343, 417, 845, 951, 124, 209, 49, 617, 856, 924,
                936, 72, 19, 28, 11, 35, 42, 40, 66, 85, 94, 112, 65, 82, 115, 119,
                236, 244, 186, 172, 112, 85, 6, 56, 38, 44, 85, 72, 32, 47, 73, 96,
                124, 217, 314, 319, 221, 644, 817, 821, 934, 922, 416, 975, 10, 22,
                18, 46, 137, 181, 101, 39, 86, 103, 116, 138, 164, 212, 218, 296,
                815, 380, 412, 460, 495, 675, 820, 952])

    def decode(self, text, cipher):
        cipher = self.__ciphers[cipher]
        for cipherKey in cipher:
            try:
                print text[cipherKey],
            except Exception, e:
                pass # out of range

text = "This is a test of the emergency broadcast system.  If this were an actual warning, something else would be said right about ... now!"

obj = Beale()
obj.decode(text, 0)

, , ,

411 views
Dec/09

2

Python Button Command Parameter

Here is a crude example of how to pass a parameter to the command of your Tkinter Button.

import Tkinter

def command(text):
    ButtonText.set(text)

root = Tkinter.Tk()

ButtonText = Tkinter.StringVar()
ButtonText.set("Do Callback")
Tkinter.Button(root, textvariable=ButtonText, command=lambda x="Hello World!": command(x)).pack()

root.mainloop()

, ,

460 views
Nov/09

27

Python MySQL Associative Array

By default, the MySQLdb module to access a MySQL database returns the data as an integer indexed array. Sometimes this is not desirable and an associative array is preferred, such as the mysql_fetch_assoc function in PHP. In addition, we will be using the pprint module which is similar PHP’s print_r

Here is the Python equivalent:

import MySQLdb
import pprint
# connect to the database here
db = MySQLdb.connect(...)
c = db.cursor(cursorclass=MySQLdb.cursors.DictCursor)
query = "SELECT `name`, `address` FROM `table`"
c.execute(query)
rows = c.fetchall()
c.close()
pprint.pprint(rows) # i.e. print_r($rows)

Hope that helps someone.

, ,

493 views

The following bit of code, which requires the win32api, simulates a mouse click using Python under the Windows OS.

import win32api, win32con

def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)

click(100, 100) # simulate mouse click at 100px, 100px

No tags

583 views

So you need to do a “Print Screen” and save the image in the clipboard huh?  I had that exact need too.  Let me save you a few hours of trouble and tell you that the win32clipboard does not yet have the ability to return the contents of the clipboard when the contents are BITMAP, despite the CF_BITMAP constant.

How do you do it then?  I was wondering the same thing.  Behold, PIL.  PIL, the Python Image Library, saved me from a massive headache.

Here is the code to take a screen shot and save it.  You will need the win32api and PIL libraries.

import win32api, win32con, ImageGrab
win32api.keybd_event(win32con.VK_SNAPSHOT, 1)
im = ImageGrab.grabclipboard()
im.save("screenshot.jpg", "JPEG")

Now wasn’t that easy!

191 views
Nov/09

17

Python Abstract Snow Art using PyGame

#
#   Abstract Random Snow Art
#   Copyright 2009 Travis Crowder
#   travis.crowder@spechal.com
#   Published under the MIT License
#
import pygame, sys, random
from pygame.color import THECOLORS

pygame.init()

screen = pygame.display.set_mode([640,480])
screen.fill([0,0,0])

for i in range(1, 2500):
    top = random.randint(2, 478)
    left = random.randint(2, 638)
    color_name = random.choice(THECOLORS.keys())
    color = THECOLORS[color_name]
    pygame.draw.rect(screen, color, [left, top, 1, 1], 1)
pygame.display.flip()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

, ,

112 views
Nov/09

17

Python Abstract Box Art using PyGame

#
#   Abstract Random Box Art
#   Copyright 2009 Travis Crowder
#   travis.crowder@spechal.com
#   Published under the MIT License
#
import pygame, sys, random
from pygame.color import THECOLORS

pygame.init()

screen = pygame.display.set_mode([640,480])
screen.fill([0,0,0])

for i in range(1, 100):
    width = random.randint(0, 250)
    height = random.randint(0, 250)
    top = random.randint(5, 435)
    left = random.randint(5, 375)
    color_name = random.choice(THECOLORS.keys())
    color = THECOLORS[color_name]
    line_width = random.randint(1,3)
    pygame.draw.rect(screen, color, [left, top, width, height], line_width)
pygame.display.flip()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

, ,

404 views
Nov/09

16

Python Temperature Converter (F to C)

#
# Convert Fahrenheit to Centigrade
# Copyright 2009 Travis Crowder
# travis.crowder@spechal.com
# Published under the MIT License
#
degrees = input("Enter the temperature in Fahrenheit to convert: ");
print degrees, "Fahrenheit is", (degrees - 32.0) * 5/9, "Centigrade"

142 views
Nov/09

16

Python Guessing Game

#
#  Guessing Game
#  Copyright 2009 Travis Crowder
#  travis.crowder@spechal.com
#  Published under the MIT License
#
import random

secret = random.randint(1,100)
guess = 0
guesses = 0

print "Guess the secret number between 1 and 100!"

while guess != secret:
    guesses = guesses + 1
    guess = input("Enter your guess: ")
    if guess > secret:
        print "Your guess is too high.  Try again!"
    elif guess < secret:
        print "Your guess is too low.  Try again!"
    else:
        print "You guessed the secret in", guesses, "guesses!  It was", secret

Find it!

Theme Design by devolux.org