Для того, чтобы отдельные особо выдающиеся персоны не вводили вас в заблуждение и не скрывались под разными именами в одном лице для них мной написан тест по отпечаткам но не пальцев, а текстов по фонетическому составу. Папа Мюллер не дремлет. Скачать транслятор можно с сайта http://www.python.org/download/ бесплатно. Код программы открытый и распространяется по GPL лицензии. Инструкцию и прочее буду отгружать по мере создания и ответов на вопросы. Нижеприведенный текст программы достаточно просто поместить в файл comparator.py в кодировке utf-8 и запустить файл на выполнение. В Windows запуск двойным щелчком как у обычного исполняемого файла, в Linux файлу назначить права на исполнение и запустить так же как обычный исполняемый файл.
Чем меньше коэффициенты различия, тем меньше вероятность написания текстов одним и тем же человеком. Лучшие объёмы текста от 1000 до 10000 знаков. Можно сравнивать непосредственно страницы с разметкой, алфавиты имеют настройку. Сравнивать лучше тексты примерно одинакового объёма.

Код
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
from tkFileDialog import askopenfilename

def distrib(t,s):
    k=1
    res={k:{}}
    for c in s: res[k][c]=float(t.count©)
    L=sum(res[k].values())
    for c in s: res[k][c]=res[k][c]/L
    while res.has_key(k):
        k+=1
        res[k]={}
        for c in list(set(reduce(lambda x,y: x+map(lambda x: x+y,s),res[k-1].keys(),[]))|\
                      set(reduce(lambda x,y: x+map(lambda x: y+x,s),res[k-1].keys(),[]))):
            n=t.count©
            if n: res[k][c]=float(n)/L
        if res[k]=={}: del res[k]
    return res

def stdev(x):
    m=float(sum(x))/len(x)
    return (reduce(lambda y,z: y+(z-m)**2,x,0)/(len(x)-1 or 1))**0.5

def diff(x,y): return map(lambda z: x.get(z,0)-y.get(z,0),list(set(x.keys())|set(y.keys())))

def comp():
    Res.delete(0.0,END)
    s1=capital.get(0.0,END).split()
    s2=lower.get(0.0,END).split()
    if len(s1) and len(s1)==len(s2):
        t1,t2=text1.get(0.0,END),text2.get(0.0,END)
        for k,m in zip(s1,s2): t1,t2=t1.replace(k,m),t2.replace(k,m)
        t1,t2=distrib(t1,s2),distrib(t2,s2)
        for k in xrange(1,max(len(t1),len(t2))+1):
            if not t1.has_key(k): t1[k]={}
            if not t2.has_key(k): t2[k]={}
        ts1,ts2={},{}
        for k in xrange(int(CompMin.get() or '1'),int(CompMax.get() or '0') or len(t1)+1):
            Res.insert(END,'Сочетания в %2i символов с отклонением %11.9f\n'%(k,stdev(diff(t1[k],t2[k]))))
            ts1.update(t1[k])
            ts2.update(t2[k])
        Res.insert(END,'Общий разброс %11.9f\n'%(stdev(diff(ts1,ts2))))
    else: Res.insert(END,'Количество строчных символов не соответствует количеству заглавных')

def OpenText1():
    text1.delete(0.0,END)
    f=open(askopenfilename(),'r')
    text1.insert(END,f.read())
    f.close()

def OpenText2():
    text2.delete(0.0,END)
    f=open(askopenfilename(),'r')
    text2.insert(END,f.read())
    f.close()


root=Tk()
root.title('Фонетическое сравнение файлов 1.0'.decode('utf-8'))
root.rowconfigure(0,weight=1)
root.columnconfigure(0,weight=1)
frame=Frame(root)
frame.rowconfigure(0,weight=1)
frame.rowconfigure(1,weight=1)
frame.rowconfigure(3,weight=1)
frame.columnconfigure(2,weight=1)
frame.columnconfigure(3,weight=1)
frame.columnconfigure(4,weight=1)
frame.columnconfigure(5,weight=1)
frame.columnconfigure(6,weight=1)
frame.grid(sticky=N+E+S+W)
#Набор символов
capital=Text(frame,width=4)
capital.insert(END,'А\nБ\nВ\nГ\nД\nЕ\nЁ\nЖ\nЗ\nИ\nЙ\nК\nЛ\nМ\nН\nО\nП\nР\nС\nТ\nУ\nФ\nХ\nЦ\nЧ\nШ\nЩ\nЪ\nЫ\nЬ\nЭ\nЮ\nЯ')
capital.grid(row=0,column=0,rowspan=2,sticky=N+S)
lower=Text(frame,width=4)
lower.insert(END,'а\nб\nв\nг\nд\nе\nё\nж\nз\nи\nй\nк\nл\nм\nн\nо\nп\nр\nс\nт\nу\nф\nх\nц\nч\nш\nщ\nъ\nы\nь\nэ\nю\nя')
lower.grid(row=0,column=1,rowspan=2,sticky=N+S)
#Первый текст
text1=Text(frame)
text1.grid(row=0,column=2,columnspan=5,sticky=N+E+S+W)
#Второй текст
text2=Text(frame)
text2.grid(row=1,column=2,columnspan=5,sticky=N+E+S+W)
#Строка кнопок
CompMin=Entry(frame,width=4)
CompMin.grid(row=2,column=0)
CompMax=Entry(frame,width=4)
CompMax.grid(row=2,column=1)
CompLab=Label(frame,text='От [1] до [max] сравнить')
CompLab.grid(row=2,column=2,sticky=E+W)
open1=Button(frame,text='Первый текст'.decode('utf-8'),command=OpenText1)
open1.grid(row=2,column=3,sticky=E+W)
open2=Button(frame,text='Второй текст'.decode('utf-8'),command=OpenText2)
open2.grid(row=2,column=4,sticky=E+W)
Compare=Button(frame,text='СРАВНИТЬ'.decode('utf-8'),command=comp)
Compare.grid(row=2,column=5,sticky=E+W)
Quit=Button(frame,text='ВЫЙТИ'.decode('utf-8'),command=root.destroy)
Quit.grid(row=2,column=6,sticky=E+W)
#Окно результатов
Res=Text(frame)
Res.grid(row=3,column=0,columnspan=7,sticky=N+E+S+W)
root.update_idletasks()
root.mainloop()


ВНИМАНИЕ!!! ОТСТУПЫ ЯВЛЯЮТСЯ ОБЯЗАТЕЛЬНЫМИ! ЭТО СИНТАКСИЧЕСКИЙ ЭЛЕМЕНТ ЯЗЫКА И ИХ СОБЛЮДЕНИЕ ОБЯЗАТЕЛЬНО! УДАЛЕНИЕ ОТСТУПОВ И НЕФОРМАТИРОВАННОЕ НАПИСАНИЕ НЕДОПУСТИМО!