[C#] Домашно Strings and Text Processing - 7 задача


24

Условие: Write a program that encodes and decodes a string using given encryption key (cipher). The key consists of a sequence of characters. The encoding/decoding is done by performing XOR (exclusive or) operation over the first letter of the string with the first of the key, the second – with the second, etc. When the last key character is reached, the next is the first.

Решениеsource.

Обяснение: Интересното при тази задача е, че криптирането и декриптирането се осъществяват по един и същ начин.

С "%" си осигуряваме цикличността на шифъра. Примерно за key = "abc":

i = 0; i % key.Length = 0 % 3 = 0; key[0] = a
​i = 1; i % 
key.Length = 1 % 3 = 1; key[1] = b
​i = 2; i % key.Length = 2 % 3 = 2; key[2] = c
​i = 3; i % key.Length = 3 % 3 = 0; key[0] = a
​i = 4; i % key.Length = 4 % 3 = 1; key[1] = b
​i = 5; i % key.Length = 5 % 3 = 2; key[2] = c

Можете да погледнете и задача 59 от Проекта Ойлер за по-подробно обяснение и да се опитате да хакнете съобщението.




Отговори



7

Много елегантно решение Браво.

Но преди да погледна твоето ето какво сътворих. Не е най-гениалното, но става. Разбито на много стъпки и по дълго разбира се. Така ги разбирам нещатата така ги правя :)

Решение:

http://pastebin.com/NxsRV5P4

Обяснение:

1. Създавам променливи str и key. Присвоявам им някакъв текст. Като key ще ми е ключът с който ще шифровам и дешифровам.

2. Правя си метод за шифроване Encrypt(string str, string key) , който има дадените параметри и връща string. Създавам си 2-а char[ ], с дължината на текста str.Length съответно keyArr и strArr, като на единия му присвоявам текста, а на другия ключа. Също така си създавам и променливата encrypted със StringBuilder-a.

3. Тук се опитвам да направя еднакви по дължина текста и ключа, като ключът ако не е с дължината на текста, го правя с такава дължина като, самият ключ се повтаря докато не достигне желаната дължина. За целта пускам един for цикъл до strArr.Length. Самият for цикъл има две водещи променливи, като едната "i" работи върху индексите и съответно дължината, а другата "к" върху ключа. Когато "к" стигне дължината на оригиналният ключ тогава к=0; идеята е да започне записва ключът отначало и така докато новият ключ не стане с дължината на текста.

Пример:

str = "малко текст за шифроване"   str.Length = 24

key = "шифърключ" - оригинален ключ

key = "шифърключшифърключшифърк" - готов за използване с XOR

4.  Тук пускам втори for цикъл пак до strArr.Length. И долепям резултата в encrypted с метода .Append()
 

ВНИМАНИЕ това което е в синьо трябва да задължително в скоби, един вид резултат от XOR на двете стойности да бъде преобразувана след това в char(звездичка, нота, сърце какъвто се падне). Казвам го защото аз брах големи ядове като нямаше скоби :), защото първо се изпълняваше преобразуването на (char)(strArr[i] и резултата XOR с keyArr[i] . Което даваше някакви глупости като резултат.

ЕТО ЗАЩО ТРЯБВА ДА СЕ ЗНАЯТ ПРИОРИТЕТИ НА ОПЕРАТОРИТЕ :)

Пример:

encrypted.Append((char)(strArr[i] ^ keyArr[i]));

 

5. Накрая на метода return encrypted.ToString(); резултатa го присвоявам на нова променлива от тип string encrypted

6. Decrypt дешофроването става по същият начин като шифроването само че на мястото на текста подавам вече шифрованият текс

 

Асси


от Assi.NET (3050 точки)


0
Можеш да криптираш директно в първия цикъл for (int i = 0, k = 0; i < text.Length; i++, k++) { if (k == key.Length) k = 0; result.Append((char)(text[i]^key[k])); } без да увеличаваш key масива

от kalo_glb (5 точки)

0
Да мога, но така задачата е разбита на повече парченца и се вижда по хубаво къде какво се случва :) за това.... иначе Благодаря за препоръката

от Assi.NET (3050 точки)



0

Ако ключът е с по-малък размер го увеличавам с Array.Resize(ref масив, 20) ис един for цикъл го обхождам за да допълня липсващите стойности, с кода keyArray[i] = keyArray[i - key.Length];

решение




0
Каква е причината да ти липсва Main() ?

от valentinvs (1327 точки)

0
Това е клас, и чрез него декларирам обект в друг файл, в който се намира Main метода.
Това е класът в който се намира Main фунцията https://github.com/tsvetomir-nikolov/TelerikAcademy/blob/master/C%23%20part%202/Strings%20and%20text%20processing/Encryption/Program.cs



2
това се решавало с два реда да... го .... еее - три часа изгубих

от ge_or_gi (110 точки)


0
Нищо де, поне си се упражнил. Аз си спомням, че като я решавах тази задача от Euler-а преди няколко години, и на мен ми отне няколко часа, а сега направо си копнах сорса :)

от jasssonpet (6814 точки)


0
Моето решение:http://pastebin.com/MJepNs8p
За криптирането, обхождам масива и резултата от XOR операцията за всеки от символите записвам в един StringBuilder.
Декриптирането е аналогично само, че се използва, вече криптирания стринг.

от petromaxa (577 точки)


7

Тази задача ми се получи доста лесно. Въртя 2 цикъла, първият дължината на стринга със стъпка дължината на chiper-а.

Вторият я дължината на чипъра.

има една проверка да не излезне извън стринга с брейк и най важният ред

char temp = (char)(str[i + j] ^ chiper[j]);

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

http://luzterin.com/?p=1646




3

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

Линк

С един for първо XOR м/у стринга и шифъра, като нулирам индекса за шифъра ако е достигнал максималната стойност, после същото м/у енкоднатия и шифъра за оригиналния стринг. 


от Rokata (397 точки)


0
Аз също съм я зарязъл. Явно съм прегрял от подготовката, но така и не мога да разбера какво точно се иска. Четох я в книгата на Наков, четох тук , но мъглата в главата ми само се сгъсти.;)

от ilv323 (803 точки)

0
Ами буквално това което от условието. :) Шифъра и думата са стрингове. Съответно им сравняваш 1-ви с 1-ви и 2-ри с 2-ри символ като ги индексираш и т.н. Но тъй като е съвсем нормално да са с различна дължина и най-вече шифъра се очкава да бъде по-къс ще се стигне до края на шифъра най-напред и нямаш съответен елемент (примерно ако думата е 10 символа шифъра 5 10-ти с 10-ти не можеш) и затова нулираш шифъра и сравняваш отново първия елемент на шифъра с този до който си стигнал в думата. :) Под сравнение разбирай да им направиш изключващо или ^ между символите и този резултат да го конвертираш в char.

от Rokata (397 точки)



1

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


от loloto (1073 точки)


2

Здравейте, колеги!

Заиграх се с тази задача и реших в метода за декриптиране да си криптирам и  декриптирам текста с вече създаден първи метод за криптиране, а пък във втория да приложа ново криптиране с втори ключ. Може и да не е много смислена програма, но ми беше интересно да видя как може да се направи задачата да работи  в Main с два ключа, а пък нямам особени познания по материята и само това успях да съчиня с наличните такива. Та ето какво се получи:

https://github.com/InaMil/Strings-and-Text-Processing--Homework-/blob/master/EncodeDecodeString.cs


от ilina (310 точки)


1

Решение: source

Имам две метода(може да се направи и с един,  лошо нещо е повтарящия се код):

1.  С първия кодираме стринга по дадения ключ, като го обхождаме и правим XOR с ключа.

2. С втория декодираме кодирания(добре звучи :) ) стринг по дадения ключ.


от stanchev (197 точки)


6

Решение

Ако ключът е с по-малка дължина от думата, добавям го към самия него, докато не стане с дължината на думата. С оперяцията XOR (^) сравнявам всеки елемент от думата и ключа и записвам резултата в encryptedString.


от teleriknetwork (2734 точки)


0

GitHub

Циркулацията според големината на ключа си е % key.Lenghth. Другото си е просто изпълнение на исканото условие.


от dzhenko (3893 точки)