Премини към съдържанието

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

A.com

Автоматична замяна на всяка дума в текст с дума от друг текст.

Препоръчан отговор


Здравейте!

  Чудя се дали някой знае програма(скрипт или каквото и да било), която да прави следното:

 

1. Взима текст от текстов файл

Пример - текст1:  

Две хубави очи. Душата на дете

в две хубави очи; - музика - лъчи

Не искат и не обещават те...

Душата ми се моли,

дете,

душата ми се моли!

Страсти и неволи

ще хвърлят утре върху тях

булото на срам и грях.

Булото на срам и грях -

не ще го хвърлят върху тях

страсти и неволи.

Душата ми се моли,

дете,

душата ми се моли...

Не искат и не обещават те! -

Две хубави очи. Музика, лъчи

в две хубави очи. Душата на дете...

 

2. Взима втори текстов файл. В него на всеки нов ред има по точно една дума.

Пример- текст2:

Occ7522CYA MJzydGmG8S 7hNzP1iiKh l9r6DyFlBQ 7x51U75vuN 1P24753A08 krwro2im96 1lep116k8K 2hW2zZseEV LrIfZslYJu 5cJppV38M7 SPc6yIB7yF 9by2Gj2PXv 26m6ToU792 jE6uuLcZlc 318OY92Xi3 TvZf9P34qv PujPRgXT2N izA59rfNJO Visa0D21qJ

 

3. Натискам Старт(или каквото там е името на бутона) и се случва следното:

 

3.1. - Взима се всяка дума от текст1 и всяко нейно съвпадение в текст 1 се заменя с думата, намираща се на ред 1 в текст2. Т.е. думата "Две" навсякъде в текст 1 се заменя с Occ7522CYA.

 

Думата "хубави" се заменя навсякъде с "MJzydGmG8S" и т. н.

 

В крайна сметка текст 1 ще се преобразува е нещо напълно не четимо и безсмислено, но точно това е и целта.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

На почти всеки скриптов език е няколко реда. Обаче условието е неясно. Трябва ли да е еднозначно съответствието? Какво правим ако думите във втория файл свършат? И т.н.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
..

 

В крайна сметка текст 1 ще се преобразува е нещо напълно не четимо и безсмислено, но точно това е и целта.

Криптиране с кодова таблица, а? Прави се лесно, както ти споменаха по-горе става с няколко реда на скриптов език. Само че кодовата книга ще е доста голяма, говорим за примерно 200 хиляди думи на български, с разни форми, времена на глаголи и т.н. минава милион. Мислиш ли че е разумно?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Криптиране с кодова таблица, а? Прави се лесно, както ти споменаха по-горе става с няколко реда на скриптов език. Само че кодовата книга ще е доста голяма, говорим за примерно 200 хиляди думи на български, с разни форми, времена на глаголи и т.н. минава милион. Мислиш ли че е разумно?

В читанката са 700000+ уникални думи които се срещат поне по 2 пъти. :P

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Думите, които ще се криптират, са еднозначни, не са членувани и не са спрегнати в различни времена, т.е. всяка дума е уникална, ако същата дума е членувана, то тя трябва да бъде заменена с друга дума от текст2.

Кодовата книга ще е от около 10 000 думи, но без проблеми мога да я направя и 10 милиона. В интернет намерих random string generator-и: линк1, линк2. Поне това е лесно.

Има още няколко условия, на които трябва да отговаря въпросното приложение:

- не е задължително да го има като опция - ако първия знак от думата в текс2 е цифра да не я ползва при "криптирането"

- задължително - да може да прескача зададени думи, т.е. има текст3, който съдържа думите:  

Иван

Стоян

Петър

Ивайло

 

Когато някоя от тези думи се срещне в текст1 тя не се заменя с дума от тескст2.

 

Казвате, че на скриптов език е лесно, но аз владея само Максскрипт. Проблема е, че всеки скрипт, написан на максскрипт работи само при инсталиран 3d Studio Max, което ще направи скрипта неизползваем на компютри, където 3dsMax не е инсталиран. Друг проблем е, че самия макскскрипт и големи по обем текстови файлове не се харесват особено много.

 

Ще съм Ви благодарен ако ме насочите към някоя програма, която прави каквото ми е необходимо, или прави поне част от него.

:)


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Трябва да прецените колко голяма е е кодовата книга, защото ако решите да заредите кодова книга в паметта това може да е предизвикателство. Каква скорост очаквате и колко е дълъг списъка с изключения? А по повод скриптовия език - всяка програма работи в някакво обкръжение, дали ще е питон, пърл баш, пауърскрипт

Мога да ви напиша нещо примерно на баш (под WIndows иска инсталиран cygwin)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Поне това е лесно.

има си хас...

Има още няколко условия, на които трябва да отговаря въпросното приложение: - не е задължително да го има като опция - ако първия знак от думата в текс2 е цифра да не я ползва при "криптирането" - задължително - да може да прескача зададени думи, т.е. има текст3, който съдържа думите: Когато някоя от тези думи се срещне в текст1 тя не се заменя с дума от тескст2.

лесни са и двете

Казвате, че на скриптов език е лесно, но аз владея само Максскрипт. Проблема е, че всеки скрипт, написан на максскрипт работи само при инсталиран 3d Studio Max, което ще направи скрипта неизползваем на компютри, където 3dsMax не е инсталиран. Друг проблем е, че самия макскскрипт и големи по обем текстови файлове не се харесват особено много.

Всички скриптови езици изискват интерпретатор инсталиран на съответният компютър. Е очевидно да използваш високо специализиран скрипт като този който си посочил за различна цел от предназначението му, не е много умно. Примери за езици, които може да ползваш Python, Ruby, PHP... Ако пък не я напишеш на скрипт, а на C++ примерно, ще трябва да я прекомпилираш за всяка различна платформа.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

До тук на ръка "поправих" няколко текста - до 1000 реда, като кодова книга от 200 думи и двата пъти беше достатъчна(много думи се повтарят понякога десетки пъти).

Изключенията са около 250-300 думи.

VBScript си работи директно в Уиндоус, ама като не го знам.  :)

Но, каквото и да ми предложите ще го ползвам.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

До тук на ръка "поправих" няколко текста - до 1000 реда, като кодова книга от 200 думи и двата пъти беше достатъчна(много думи се повтарят понякога десетки пъти).

Изключенията са около 250-300 думи.

VBScript си работи директно в Уиндоус, ама като не го знам.  :)

Но, каквото и да ми предложите ще го ползвам.

Утре ще си поиграя да направя един скрипт за целта. Аз мога да го напиша на баш и ще ви обясня как да си инсталирате баш на вашата машина

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ако пък не я напишеш на скрипт, а на C++ примерно, ще трябва да я прекомпилираш за всяка различна платформа.

 

Не че ми разбира нещо главата от езици, ама за тия двата нали си има безплатни витуални машини

Java  и C#

които са и за Уиндоуз и за Линукс и май не трябва да се прави различен код, ами един и същ ще върви и на двете.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Не че ми разбира нещо главата от езици, ама за тия двата нали си има безплатни витуални машини

Java  и C#

които са и за Уиндоуз и за Линукс и май не трябва да се прави различен код, ами един и същ ще върви и на двете.

джава да, но за С# доста ще се озориш да го пуснеш под линукс. И иска компилация, не е като джавата до междинен код, който се изпълнява от джава машината

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

capnemo, благодаря ти.

Скрипта и каквото му е нужно за да работи ще го инсталирам на VMWare+WinXP.

Ще се погрижа и на другите компютри, на които ще се ползва да има поне WInXP като ОС.

 

Да не забравя - тези символи също трябва да се пропускат и да не се заменят с дума от текст2 файла:

 

:/~!@#$%^&*()+=|'?><;?"{}[],.-

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

джава да, но за С# доста ще се озориш да го пуснеш под линукс. И иска компилация, не е като джавата до междинен код, който се изпълнява от джава машината

 

Какво ми разправяш тука за С# ?

Аз по принцип трябваше да го почна, ама се отвориха едни други задачи, та ще почака.

В купищата книги които намерих за него, описват и виртуалната машина за Линукс, която не е официално на Микрософт май, та й е друго заглавието. Обаче понеже чета на три езика, та не мога да се сетя къде точно да отворя да ги намеря тези обяснения.

Ама човека като ще ползва УинХП значи няма проблеми никакви в неговия случай , ако е писано на С#.

 

Но ти ако ще му помогнеш с друг вариант , ще му е още по-лесно.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

capnemo, благодаря ти.

Скрипта и каквото му е нужно за да работи ще го инсталирам на VMWare+WinXP.

Ще се погрижа и на другите компютри, на които ще се ползва да има поне WInXP като ОС.

 

Да не забравя - тези символи също трябва да се пропускат и да не се заменят с дума от текст2 файла:

 

:/~!@#$%^&*()+=|'?><;?"{}[],.-

Това (за замяна на символите) зависи от ключовата книга. Ако тя е във вида <дума>,<дума> няма никакъв проблем Защото ти просто няма да включваш подобни неща в думите

Какво ми разправяш тука за С# ?

Аз по принцип трябваше да го почна, ама се отвориха едни други задачи, та ще почака.

В купищата книги които намерих за него, описват и виртуалната машина за Линукс, която не е официално на Микрософт май, та й е друго заглавието. Обаче понеже чета на три езика, та не мога да се сетя къде точно да отворя да ги намеря тези обяснения.

Ама човека като ще ползва УинХП значи няма проблеми никакви в неговия случай , ако е писано на С#.

 

Но ти ако ще му помогнеш с друг вариант , ще му е още по-лесно.

Ти хубаво четеш, но аз все пак си изкарвам хляба с линукс :) (и чета на 4 езика, освен 10-тина компютърни)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

Ти хубаво четеш, но аз все пак си изкарвам хляба с линукс :) (и чета на 4 езика, освен 10-тина компютърни)

 

E като си го изкарваш хляба с Линукс, това не го ли знаеш ???

 

http://www.mono-project.com/About

http://www.mono-project.com/Main_Page

 

или викаш че цял Свят се е наговорил да ме будалка мене точно, щото не си играя повече с Линукс, та не съм в час сигурно, така ли ?

 

На мен не ми трябва Линукс, ама по книгите като ми разправят че щяло да върви и там, та им вярвам.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Не че ми разбира нещо главата от езици, ама за тия двата нали си има безплатни витуални машини Java  и C# които са и за Уиндоуз и за Линукс и май не трябва да се прави различен код, ами един и същ ще върви и на двете.

Това че са безплатни не ги прави автоматично инсталирани. .NET фреймуърк не е задължително да е инсталиран (и най-вероятно не е) на не-уиндоус система. На XP също може да го няма. Абсолютно същото важи за Java. Ти като един типичен уиндоус потребител си свикнал да си администратор на собственият си компютър, но в общият случай ако искаш преносимост, може да стигнеш до такъв, на който нямаш права да инсталираш нищо. А пък, аз нямаше как да знам, дали това е така за конкретния случай и просто предупреждавах.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

capnemo, ще трябва да ми кажеш как да са подредени думите в кодовата книга/таблица.

На мен по-удобно ми е на всеки ред отделна дума/символ(:/~!@#$%^&*()+=|'?><;?"{}[],.-), защото е по-лесно четимо, но ако разделянето със запетая е по-добре за скрипта, който ще напишеш, то ще я направя както трябва за да работи правилно.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

capnemo, ще трябва да ми кажеш как да са подредени думите в кодовата книга/таблица.

На мен по-удобно ми е на всеки ред отделна дума/символ(:/~!@#$%^&*()+=|'?><;?"{}[],.-), защото е по-лесно четимо, но ако разделянето със запетая е по-добре за скрипта, който ще напишеш, то ще я направя както трябва за да работи правилно.

идеята ми е да напишеш двойките думи на един ред, разделени със запетайки

дума_коя_ще_заместваме,стринг_с_който_ще_заместваме

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

capnemo, ще трябва да ми кажеш как да са подредени думите в кодовата книга/таблица.

На мен по-удобно ми е на всеки ред отделна дума/символ(:/~!@#$%^&*()+=|'?><;?"{}[],.-), защото е по-лесно четимо, но ако разделянето със запетая е по-добре за скрипта, който ще напишеш, то ще я направя както трябва за да работи правилно.

Ето един примерен скрипт:

#!/bin/bash#CBOOK=~/files/codebook.txtEFILE=~/files/exceptions.txtIFILE=$1OFILE=$2cp $IFILE $OFILEwhile read worddo  for i in $word  do    if [ "$(grep -w $i $EFILE)" == "" ]	  then TWORD=$(grep -w $i $CBOOK|awk -F, '{ print $2}')		   sed -i s/$i/$TWORD/g $OFILE  	 fi  done  done <$IFILE

Изискваният за него са:

1. инсталиран cygwin и в него grep, awk, sed

2. в домашната директория на шела поддиректория files със съдържание файловете codebook.txt и exceptions.txt (надявам се е ясно кой кой е. Примерни файлове изглеждат така:

romeo@romeoninov:~/tmp$ cat files/codebook.txta1,b1a5,b5aa9,bb9c9,bbc9romeo@romeoninov:~/tmp$ cat files/exceptions.txta2a3

3. скрипта се създава с някакъв редактори и се прави изпълним

chmod +x script_name.sh

4 изпълнява се като за първи параметър му се дава входния файл, за втори изходния файл

script_name.sh path/input_file other_path/output_file

 

Ако имате въпроси питайте :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това че са безплатни не ги прави автоматично инсталирани. .NET фреймуърк не е задължително да е инсталиран (и най-вероятно не е) на не-уиндоус система. На XP също може да го няма. Абсолютно същото важи за Java. Ти като един типичен уиндоус потребител си свикнал да си администратор на собственият си компютър, но в общият случай ако искаш преносимост, може да стигнеш до такъв, на който нямаш права да инсталираш нищо. А пък, аз нямаше как да знам, дали това е така за конкретния случай и просто предупреждавах.

 

Прав си.

Аз разсъждавам единствено от гледната точка на човек, който има контрол над ползваната машина.

И заради това даже си бях представил възможността да им инсталирам аз на компютрите на разни клиенти, едно бъдещо хипотетично софтуерно създание, за да е сигурно че ще тръгне да работи пред мен и като му прибера паричките, после да не може да мрънка че това не става, онова не тръгва и ала бала.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

идеята ми е да напишеш двойките думи на един ред, разделени със запетайки

дума_коя_ще_заместваме,стринг_с_който_ще_заместваме

 

Довечера ще инсталирам и тествам. Обаче, така както си го задал:

дума_коя_ще_заместваме,стринг_с_който_ще_заместваме

не ми върши работа. Всеки текстов файл, който трябва да се "криптира" е уникален. Всеки път думите в него са различни. Ако трябва за всеки да създавам отделна кодова книга е все едно на ръка да си замествам думите с random generated strings.

 

А може и да не съм разбрал правилно как точно работи скрипта, който си написал. Довечера ще прегледам по-обстойно кое какво прави и как работи.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Довечера ще инсталирам и тествам. Обаче, така както си го задал:

дума_коя_ще_заместваме,стринг_с_който_ще_заместваме

не ми върши работа. Всеки текстов файл, който трябва да се "криптира" е уникален. Всеки път думите в него са различни. Ако трябва за всеки да създавам отделна кодова книга е все едно на ръка да си замествам думите с random generated strings.

 

А може и да не съм разбрал правилно как точно работи скрипта, който си написал. Довечера ще прегледам по-обстойно кое какво прави и как работи.

Не, прави се една голяма кодова книга. И ако има нужда се добавя в нея (нови двойки дума-код)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

@A.com,

 

Условието да се използва кодова таблица задължително ли е ? Или "...ще се преобразува е нещо напълно не четимо и безсмислено, но точно това е и целта." е достатъчно ? Защото в общия случай, ако се използва двупосочно криптиране с парола (n на брой паса, с m на брой алгоритми), цялата хамалогия се свежда до един ред. Вече, ако искаш да имаш уникален ключ за всеки текст, то методи колкото искаш. Например, много просто можеш за ключ да използваш hash-a на текста в явен вид.

 

пример за PHP,

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

capnemo, т

 

Не, прави се една голяма кодова книга. И ако има нужда се добавя в нея (нови двойки дума-код)

 

Това променя нещата.

Няма как да знам в следващия текстов файл какви думи ще има. Може да се окаже, че нито една от думите в кодовата книга не присъства в текстовия файл, който ще се криптира.

 

3nf, целта е да се получи нещо не четимо и безсмислено, като не е нужно да има ключ за дектиптиране.

Както съм обяснил в първото си мнение в темата - всеки текст1 файл съдържа различни думи, подредени по различен начин. Думите може да са написани на кирилица или на латиница. Това усложнява работата с кодовата книга.

 

Така, както аз си представям да работи даденото приложение ще трябва да има три входни текстови файла

- textToEncrypt.txt - текста, който ще се криптира

- codeWords.txt - съдържа думите, които ще се ползват за криптиране(заместват думите в textToEncrypt.txt) и мога да имам 100 кодови книги с по 1000 думи в тях и всеки път да използвам различна кодова книга. Знам, че в случая използвам "кодова книга" неправилно като термин, но...:)

- exceptions.txt - съдържа думите, които не трябва да се криптират, ако бъдат намерени в textToEncrypt.txt

 

Ако го направя в максскрипт ще работи по следният начин(примерен алгоритъм).

1. отварят се трите файла.

2. създава се копие на textToEncrypt.txt

3. създава се файл - usedCodeWords.txt, в който се записват всички думи от codeWords.txt, които вече са използвани

4. един while Loop и в него се случва следното

 4.1. взима се първата дума от текст1, нека да я наречем word1

 4.2. проверява се дали word1 не присъства в exceptions.txt. Ако присъства се минава към 4.1(т.е. word1 не трябва да се криптира). Ако не присъства, word1 трябва да се криптира и се отива на 4.3

 4.3. проверява се дали word1 не присъства в usedCodeWords.txt, т.е. дали word1 не е кодова дума, например 125-тата дума в текста вече е била кодирана. Ако word1 не е вече използвана кодова дума се отива на 4.4. Ако е използвана кодова дума се отива на 4.1

 4.4 всички съвпадения на word1 в textToEncrypt.txt се заменят със дума от codeWords.txt( ще я нарека codeWord1). Условието е: номера на думата в textToEncrypt.txt служи като указател коя дума от codeWords.txt да се използва. Например 124-тата дума в textToEncrypt.txt(без значение каква е) се заменя с 124 дума(думата намираща се на ред 124 ако на всеки ред има отделна дума) от codeWords.txt. Това означава, че целия textToEncrypt.txt ще бъде проверен дума по дума и така за всяка следваща дума(текста за проверка ще намалява, но...)

 4.5. codeWord1 се записва в usedCodeWords.txt за да се избегне прекриптирането на вече криптирана дума.

 4.6 отива се в началото на while цикъла и така до последната дума в textToEncrypt.txt

 

Проблема на максскрипт е, че не е създаден за работа със стрингове. Може да работи с тях, но много много неефективно.

Например когато създам стринг и го присвоя на променлива се заделя място в паметта, където този стринг се съхранява.

str = "Kostadin"

ако искам да променя дори само една буква в този стринг, или да добавя/премахна нова буква/букви:

str += "ka" -- резултата вече е "Kostadinka"

В паметта се заделя ново място за str, но старата памет не се освобождава, което е изключително неефективно(да не кажа тъпо), ама това е положението.

 

Мислех си, че други скриптови езици ще са по приятелски настроени при работата със стрингове и имат директна команда от вида "find all X and replace with Y", но може и да греша. По-точно си мислех, че съществуват програми, които правят това, за което питам. :)

 

Ще трябва да си наседна дупето и да се опитам сам да си реша проблема, за да не Ви занимавам с моите глупости. :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

този скрипт, който публикувах прави това. И ще работи независимо от това дали ползвате нова кодова книга и изключения. Просто ще трябва да ги създавате всеки път. И разбрахте ли защо в началото на дискусията говорихме за милион и отгоре двойки в кодовата книга.

Това е интересно упражнение, но в този вид безкрайно безсмислено. Кажете каква е крайната ви цел, по-горе ви предложиха криптография с парола, какво не ви харесва в нея?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.