Този метод за криптиране и декриптиране добър ли е и става ли да се напише с рекурсия.

+10 гласа
436 прегледа
попитан 2016 август 30 от bobo_86 (230 точки)
Този метод за екриптване добър ли е и ства ли да се напише с рекурсия.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

    public class Node

    {

        public string name { get; set; }

        public string adres { get; set; }

        public Node()

        {

            this.name = "Boris";

            this.adres = "Sofia";

        }

        public Node(string name, string adres)

        {

            this.name = name;

            this.adres = adres;

        }

    }

    public class Program

    {

        static void Main(string[] args)

        {

            Node bbb = new Node();

            Node bbb1 = new Node("Marina", "Ruse");

            List<Node> bobo = new List<Node>();

            bobo.Add(bbb);

            bobo.Add(bbb1);

            encryp(bobo);

           

            Console.WriteLine(bobo[0].name);

            Console.WriteLine(bobo[0].adres);

            Console.WriteLine(bobo[1].name);

            Console.WriteLine(bobo[1].adres);

            decrypt(bobo);

            Console.WriteLine(bobo[0].name);

            Console.WriteLine(bobo[0].adres);

            Console.WriteLine(bobo[1].name);

            Console.WriteLine(bobo[1].adres);

        }

     

        private static void encryp(List<Node> bobo)

        {

            char[] ch = new char[20];

            for (int i = 0; i < bobo.Count; i++)

            {

                ch = new char[bobo[i].name.Length];

                for (int j = 0; j < bobo[i].name.Length; j++)

                {

                    ch[j] = (char)((int)bobo[i].name[j] + 32 + 43 + 21 - 11 + 54);

                }

                string news = new string(ch);

                bobo[i].name = news;

                ch = new char[bobo[i].adres.Length];

                for (int k = 0; k < bobo[i].adres.Length; k++)

                {

                    ch[k] = (char)((int)bobo[i].adres[k] + 32 + 43 + 21 - 11 + 54);

                }

                news = new string(ch);

                bobo[i].adres = news;

            }

        }

        private static void decrypt(List<Node> bobo)

        {

            char[] ch = new char[20];

            for (int i = 0; i < bobo.Count; i++)

            {

                ch = new char[20];

                for (int j = 0; j < bobo[i].name.Length; j++)

                {

                    ch[j] = (char)((int)bobo[i].name[j] - 32 - 43 - 21 + 11 - 54);

                }

                string news = new string(ch);

                bobo[i].name = news;

                ch = new char[20];

                for (int k = 0; k < bobo[i].adres.Length; k++)

                {

                    ch[k] = (char)((int)bobo[i].adres[k] - 32 - 43 - 21 + 11 - 54);

                }

                news = new string(ch);

                bobo[i].adres = news;

            }

        }

    }

}

1 отговор

0 гласа
отговорени 2016 август 30 от ilinovster (1,870 точки)

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

Колкото до рекурсия:
Казва се, че един обект е рекурсивен, ако той частично се съдържа в себе си или е дефиниран чрез себе си.

Тука аз не виждам такова определение.

Но да се върнем към част от кода: 

ch[j] = (char)((int)bobo[i].name[j] + 32 + 43 + 21 - 11 + 54);

От програмна гледна точка не виждам смисъл от прибавянето и изваждането на поредица от числови константи към дадена променлива. Ако формализираме горния код то:

ch[j] = (char)((int)bobo[i].name[j] + 32 + 43 + 21 - 11 + 54);

е еквивалентно на :

ch[j] = (char)((int)bobo[i].name[j] + (32 + 43 + 21 - 11 + 54));

което от своя страна пък е:

ch[j] = (char)((int)bobo[i].name[j] + 139);

Другият въпрос, който поражда този израз е: 

Ами ако bobo[i].name e ASCII символ (0..0xff) или е utf8 код и стойността на 

bobo[i].name[j] = 0xff, ако е ASCII или bobo[i].name[j] = 0xffff, ако е utf8 какво се случва???

От гледна точка на оптимизация на кода е по-добре криптирането и декриптирането на даден символен низ да се отделят в отделни функции:

private string encryptString( string str);
private string decryptString* string str);

...