# -*- coding: utf-8 -*-
import sys
sys.path.append( "BitVector-3.0/" )
import BitVector
 
#Salaus
def salaa(data, key):
	xorred = data^key # data XOR key
	matrix = [[0 for col in range(8)] for row in range(8)]#8*8 matriisi alustettu nollilla
	#Kopioidaan XOR-lopputulos matriisiin
	index=0
	for i in range (8):
		for j in range (8):
			matrix[i][j]=xorred[index]
			index=index+1
 
	shuffled = BitVector.BitVector(size = 64)#BitVector salatulle tiedolle
	#Kopioidaan matriisin sisältö bitvectoriin alkaen oikeasta yläkulmasta
	index=0
	for i in range (8):
		for j in range (8):
			shuffled[index]=matrix[j][7-i]
			index=index+1
	return shuffled #Palautetaan salattu data
 
#Avaus
def avaa(data, key):
	matrix2 = [[0 for col in range(8)] for row in range(8)]#8*8 matriisi alustettu nollilla
	#Kopioidaan salattu tieto matriisiin
	index=0
	for i in range (8):
		for j in range (8):
			matrix2[i][j]=data[index]
			index=index+1
 
	deshuffled = BitVector.BitVector(size = 64)
	#Kopioidaan tiedot matriisista bitvectoriin palauttaen alkuperäisen bittijärjestyksen
	index=0
	for i in range (8):
		for j in range (8):
			deshuffled[index]=matrix2[7-j][i]
			index=index+1
 
	return deshuffled^key #Tehdään bitvectorille ja avaimelle XOR ja palautetaan tulos
 
#Pääohjelma
#avataan tiedosto lukemista varten
bv  =  BitVector.BitVector(filename = sys.argv[1])
 
x = input("Anna avain: ")
key = BitVector.BitVector( intVal = int(x), size = 64)
 
x = input("Anna alustusvektori: ")
iv = BitVector.BitVector( intVal = int(x), size = 64)
 
# Avataan toinen tiedosto, johon kirjoitetaan salattu data
FILEOUT = open( 'salattu.txt', 'wb' )
 
first_block=True
previous_block  =  BitVector.BitVector(size = 64)
 
while True:
	bv1 =  bv.read_bits_from_file( 64 )
	print str(bv1.size)
	if bv1.size == 0:
		break
	elif bv1.size == 64:
		if first_block:
			xorred = bv1^iv 
			first_block=False
		else:
			xorred = bv1^previous_block 
		salattu=salaa(xorred, key)
		salattu.write_to_file( FILEOUT )
		previous_block=salattu
		print "Salattu " + str(salattu)
	else:
		n = 64 - bv1.size
		bv1.pad_from_right( n )
		if first_block:
			xorred = bv1^iv 
			first_block=False
		else:
			xorred = bv1^previous_block 
		salattu=salaa(xorred, key)
		salattu.write_to_file( FILEOUT )
		previous_block=salattu
		print "Salattu " + str(salattu)
		break
 
#suljetaan tiedostot
bv.close_file_object()
FILEOUT.close()
 
#Avataan salattu data
#avataan tiedosto lukemista varten
bv  =  BitVector.BitVector(filename = 'salattu.txt')
#Avataan tiedosto, johon kirjoitetaan avattu data
FILEOUT = open( 'avattu.txt', 'wb' )
first_block=True
while True:
	bv1 =  bv.read_bits_from_file( 64 )
	if bv1.size != 0:
		avattu=avaa(bv1, key)
		if first_block:
			xorred = avattu^iv
			first_block=False
		else:
			xorred = avattu^previous_block 
		#Etsitään tiedoston loppuun lisätyt nollatavut (jotta tiedoston saa vielä auki editorilla)
		#ja jätetään nollatavut pois tiedostoon kirjoitettavasta pätkästä
		korjaa=False
		for i in range (8): #Käydään luettu pätkä läpi tavu kerrallaan
			if (int(xorred[i*8:i*8+8]))==0:#Jos löytyy nolla, niin keskeytetään
				korjattu=xorred[0:i*8]
				korjaa=True
				break
		if korjaa:
			korjattu.write_to_file( FILEOUT )
		else:
			xorred.write_to_file( FILEOUT )
		print "Avattu " + str(salattu)
		previous_block=bv1
	else:
		 break
 
#suljetaan tiedostot
bv.close_file_object()
FILEOUT.close()
Last modified: 2013/07/01 14:42