Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Paster
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 3
#1

Шифрование символов в файле - C++

14.06.2012, 01:24. Просмотров 1293. Ответов 5
Метки нет (Все метки)

День добрый!
Проблема такова:
Есть файл содержащий исходный набор символов(текст, строки и т.д.).
нужно составить программу для шифрования каждого символа исходного файла методом добавления определенного ключа, записать эту последовательность в другой файл, и дешифровать сообщение в третий файл.

Есть исходный код на Delphi.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
program Crypto;
{$APPTYPE CONSOLE}
 
const
  KEY = 'ASO';
 
var
  fi, fo, fu: File;
  input, output: byte;
  j, len: integer;
 
begin
  Assign(fi, 'input.txt');
  Assign(fo, 'output.txt');
  Assign(fu, 'output2.txt');
  Reset(fi,1);
  Rewrite(fo,1);
  Rewrite(fu,1);
  try
    j := 1;
    len := length(KEY);
    while not(EoF(fi)) do
    begin
      blockread(fi, input, 1);
      output := (input+ord(KEY[j])) mod 256;
      blockwrite(fo, output, 1);
      j := j + 1;
      if j > len then
        j := 1
    end;
    Close(fo);
    Reset(fo,1);
    j := 1;
    while not(EoF(fo)) do
    begin
      blockread(fo, input, 1);
      output := (input+256-ord(KEY[j])) mod 256;
      blockwrite(fu, output, 1);
      j := j + 1;
      if j > len then
        j := 1
    end;
  finally
    Close(fi);
    Close(fo);
    Close(fu);
  end;
end.
Можно его переправить на с++?
Очень надо! Сдавать лабу надо 14.06.
Спасибо за ранее

Добавлено через 9 часов 30 минут
В общем чего то я "намутил", получился такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//---------------------------------------------------------------------------
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
 
 
 
using namespace std;
//---------------------------------------------------------------------------
void main()
{
    //fstream  in, crypt, decrypt;
    ifstream in;
    fstream crypt;
    ofstream decrypt;
    in.open("C:\\in.txt",ios::out|ios::binary);
    crypt.open("C:\\crypt.txt",ios::in|ios::out|ios::binary);
    decrypt.open("C:\\decrypt.txt",ios::in|ios::binary);
 
    char *key = "sd";
    /*cout<<"Vvedite Kluch: ";
    cin>>*key; */
    double n=strlen(key);
    double i=0;
    short int j;
    char temp, buff=NULL;
    while(!in.eof())
    {
        in.read((char*)&buff, sizeof(buff));
        //b=buff;
        j=fmod(i,n);
        temp=buff^key[j];
        crypt.put(temp);
        i++;
        buff=NULL;
    }
    in.close();
    //crypt.close();
    //crypt.open("C:\\crypt.txt",ios::out|ios::binary);
    decrypt.open("C:\\decrypt.txt",ios::in|ios::binary);
    double k=0;
    short int b;
    char temp1, buff1=NULL;
    while (!crypt.eof())
    {
        crypt.read((char*)&buff1, sizeof(buff1));
        //b=buff;
        b=fmod(k,n);
        temp1=buff1^key[j];
        decrypt.write((char*)&temp1,sizeof(temp1));
        k++;
        buff1=NULL;
    }
    crypt.close();
    decrypt.close();
 
    getch();
}
Вопрос сейчас встал в том, чтоб открыть файл crypt.txt для чтения из него во второй части кода!
т.е. сначала в него записываем шифрованное сообщение, закрываем, а потом открываем для чтения.
Уже битый час сижу и отупляю((((
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2012, 01:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шифрование символов в файле (C++):

Шифрование текста в файле - C++
проблема в то что в процессе работы программа должна считывать текст в файле и кодировать его. Прога работает нормально,т.е. кодирует...

Как организовать шифрование данных в текстовом файле? - C++
Доброго времени суток форумчане. Я в этой теме абсолютный нуль, по-этому прошу вашей помощи. У меня есть, к примеру, файл для хранения...

Шифрование / дешифрование (метод перестановки символов) - C++
Здравствуйте.проблема такая:по варианту дали ключ и метод шифрования.похожие темы нашел но не то(( вернее начало нашел тут...

Шифрование текста путем замены символов - C++
Здравствуйте! Нужна Ваша помощь. Нужно провести шифрование предложения заменой символов в си++. Есть работа в Паскале, а как в си++сделать...

Шифрование методом перестановки символов в заданном порядке - C++
Здравствуйте уважаемые знатоки. Помогите пожалуйста. Мне нужен код(разобраться не могу)%-) шифрования.Пример: 1.вводим: привет 2.задаём...

добавление символов в файле - C++
подскажите как добавить в файле ,символ в начале и в конце строки,а также символ в пустой строке,например: было так В этом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
14.06.2012, 02:13 #2
лови

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stdafx.h"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"RUSSIAN");
    //инициализация ключа
    int key[5] = {1,2,4,5,8};
 
    int count = 0;
    
    //чтение файла-оригинала
    ifstream filestr,forUnEncrypting;
    ofstream fileEncrypted,UnEncrypted;
    
    filestr.open("d:\\enrcyption\\be_god.txt",ifstream::in);
    if (filestr.is_open())
        {
      while (!filestr.eof() ) 
      {
          filestr.get();
          count++;
      }
    }
    filestr.close();
     
    int  *buffer = new int[count];
 
    filestr.open("d:\\enrcyption\\be_god.txt");
 
    if (filestr.is_open())
    {
        int i;
      for (i=0;!filestr.eof();i++ ) 
        {
          buffer[i] = filestr.get();
        }
    }
    filestr.close();
 
    //запись с шифрованием
 
    fileEncrypted.open("d:\\enrcyption\\be_god_Encrypted.txt");
    
    int j;
    for (j=0;j < count;)
    {
        int i;
        for (i=0;i<5;i++,j++)
        {
            fileEncrypted.put(char(buffer[j]+key[i])) ;
    }
      }
      fileEncrypted.close();
 
 
      forUnEncrypting.open("d:\\enrcyption\\be_god_Encrypted.txt");
 
      int  *bufferForUnEcrypting = new int[count];
 
    if (forUnEncrypting.is_open())
    {
        int i;
      for (i=0;!forUnEncrypting.eof();i++ ) 
        {
          bufferForUnEcrypting[i] = forUnEncrypting.get();
        }
    }
    forUnEncrypting.close();
 
    UnEncrypted.open("d:\\enrcyption\\be_god_UnEncrypted.txt");
    
    
    for (j=0;j < count;)
    {
        int i;
        for (i=0;i<5;i++,j++)
        {
            UnEncrypted.put(char(bufferForUnEcrypting[j]-key[i])) ;
    }
      }
      UnEncrypted.close();
 
 
      
    return 0;
}
образец, над которым делаются действия - http://lib.ru/STRUGACKIE/be_god.txt

шифрование простенькое, но работает
0
dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
16.06.2012, 04:20 #3
переписал предыдущий код, теперь немного лучше и проще:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// encryption.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"RUSSIAN");
 
    //инициализация ключа
    //
    int key[5] = {1,2,4,5,8};
    
    int i; 
    
    ifstream filestr,forUnEncrypting;
    ofstream fileEncrypted,fileUnEncrypted;
    
    filestr.open("d:\\enrcyption\\be_god.txt",ifstream::in); //чтение образца
    fileEncrypted.open("d:\\enrcyption\\be_god_Encrypted.txt"); //запись зашифрованного
    if (filestr.is_open())
    {
        while (!filestr.eof()) 
        {
            for (i=0;i<5;i++)
            {
                fileEncrypted.put(char(filestr.get()+key[i])) ;
            }
        }
    }
    filestr.close();
    fileEncrypted.close();
 
    forUnEncrypting.open("d:\\enrcyption\\be_god_Encrypted.txt");//чтение зашифрованного
    fileUnEncrypted.open("d:\\enrcyption\\be_god_UnEncrypted.txt");//запись расшифрованного
 
    if (forUnEncrypting.is_open())
    {
        while (!forUnEncrypting.eof()) 
        {
            for (i=0;i<5;i++)
            {
                fileUnEncrypted.put(char(forUnEncrypting.get()-key[i])) ;
            }
        }
    }
    forUnEncrypting.close();
    fileUnEncrypted.close();
 
    return 0;
 
}
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.06.2012, 06:20 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Paster Посмотреть сообщение
Есть файл содержащий исходный набор символов(текст, строки и т.д.).
нужно составить программу для шифрования каждого символа исходного файла методом добавления определенного ключа, записать эту последовательность в другой файл, и дешифровать сообщение в третий файл.
Простейшими шифрами с ключом являются ксорка, циклический алфавитный сдвиг и замена символов по таблице отображения. Можно двигать/заменять хоть коды по всему шрифту. Ксорка - это побитовое исключающее И, на c++ делается через
C++
1
^
. Ключ - данное той же разрядности, с которым ксоришь, для расшифровки надо повторно заксорить с тем же ключом. Если повторно заксорить вместо ключа с текстом, то восстановишь ключ вместо текста. Таким образом, ксорка симметрична. Можно циклически менять байты/слова ключа в пределах всего сообщения, тогда ключь - массив элементов той же разрядности:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Encode(char *text, *key, unsigned int KeyLength)
{
 char *p;
 unsigned  i;
 for (i=0, p=text; *(p-1)!=0, ++p, i=(i+1)%KeyLength)
 {
  *p^=key[i];
 }
}
void Decode(char *text, *key, unsigned int KeyLength)
{
 char *p;
 unsigned  i;
 for (i=0, p=text; *(p-1)!=key[i], ++p, i=(i+1)%KeyLength)
 {
  *p^=key[i];
 }
}
. Циклический сдвиг - это, например, "A" становится "В", "Б "- "Г" и так далее, а в конце "Э" - "Я", "Ю" - "А", "Я" - "Б". Или наоборот. Ключ - буква, в которую превращается "A", для расшифровки двигай в обратную сторону. Таким образом, циклический сдвиг асимметричен, но не в том смысле, какой в это вкладывают криптографы, так как оба ключа одинаково просто вычисляются друг по другу: если шифрующий "В", то дешифрующий "Ю". Пусть буква шифрующего ключа отстоит от "А" на n букв в право, тогда буква дешифрующего ключа отстоит от "Я" на n-1 букв влево и если буква дешифрующего ключа отстоит от "Я" на n букв влево, то буква шифрующего ключа отстоит от "А" на n+1 букв в право. Асимметричный эе шифр должне иметь асимметричную сложность вычисления ключей друг по другу. Но если циклический сдвиг алфавита рассматривать только как преоборазование, но не как шифр, то оно симметрично. Ключ может быть словом естественного языка, фразой, аброкадаброй, или вообще любым сочетанием букв, тогда буквы ключа циклически меняются по всему сообщению, аналогично циклической смене байтов ключа ксорки. Способ табличной шифрации и дешифрации и что есть ключ в этом случае комментировать не буду, это должно быть и так понятно каждому, кто знаком вообще со словом "таблица". Напишу только, что такие шифры тоже допускают циклическую смену ключа. Табличный шифр тоже симметричен в криптографическом значении слов "симметричный"/"асимметричный", но ассиметричен, как преобразование.
1
RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
16.06.2012, 06:39 #5
Я что то подобное когда то писал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*ÏðîãðГ*ììГ* øèôðóåò/äåøèôðóåò ëþáîé ГґГ*éë
ÒåñòèðîâГ*Г«Г*Г±Гј Г*Г* .avi, .doc, .txt, mp3.
*/
#include <iostream>
#include <conio.h>
#include <fstream>
#include <cstring>
#include <stdio.h>
#include <windows.h>
 
using namespace std;
/*------key1 - êëþ÷. ГЇГ*ðîëü///filename1[30] - èìÿ ГґГ*éëГ* Г*Г* âõîäå
filename2[30] - èìÿ ГґГ*éëГ* Г*Г* âûõîäå///k1 - äëèГ*Г* êëþ÷Г*
coding1,2,3 - ïåðåìåГ*Г*ûå äëÿ ïðåîáðГ*çîâГ*Г*ГЁГї èñõîäГ*îãî ñèìâîëГ**/
int main()
{
    FILE *fp1, *fp2, *fp3, *fp4;//îáúÿâëÿåì ïîòîêè
    char filename1[30], filename2[30],key1[20];
    int n=0,m=0,k1;
    unsigned char code=0;
    int temp;
    int coding1, coding2, coding3, coding4, z;
    cout << "1 - Г‡Г*øèôðîâГ*ГІГј ГґГ*éë.\n" << "2 - Г°Г*ñøèôðîâГ*ГІГј ГґГ*éë\n";
    cin >> z;
    if(z==1)
    {
       cout << "Ââåäèòå ГЇГ*ðîëü äëÿ øèôðîâГ*Г*ГЁГї: ";
       cin >> key1;
       cout << "key = " << key1;
       cout << "\nÂâåäèòå èìÿ ГґГ*éëГ* äëÿ øèôðîâГ*Г*ГЁГї: ";
       cin >> filename1;
       k1 = strlen(key1);//îáðГ*áîòêГ* êëþ÷Г*
       cout << "k1 = " << k1 << endl;
       for(int i=0;i<k1;i++)
       {
            code = (code + key1[i]);
       } 
       // m - âû÷èñëÿåòñÿ ГЁГ§ êëþ÷Г* ñëîæåГ*ГЁГҐГ¬ ГЇГ® ìîäóëþ 2^6
       for(int i=1;i<k1;i++)
       {
            m = (key1[i-1] + key1[i])%64;
       }
       cout << "m = " << m << endl;
       /*îòðûâГ*ГҐГІ âõîäГ*îé ГґГ*éë òîëüêî äëÿ 
       Г·ГІГҐГ*ГЁГї Гў ГЎГЁГ*Г*Г°Г*îì ðåæèìå*/
       fp1 = fopen(filename1, "rb");
       if (!fp1)
       {
          cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
          getch();
          exit(1);
       }
       cout << "\nÂâåäèòå èìÿ Г§Г*øèôðîâГ*Г*Г*îãî ГґГ*éëГ*: ";
       cin >> filename2;
       /*îòêðûâГ*ГҐГ¬ Г*îâûé ГґГ*éë äëÿ Г§Г*ГЇГЁГ±ГЁ
       Гў ГЎГЁГ*Г*Г°Г*îì ðåæèìå*/
       fp2 = fopen(filename2, "wb");
       if (!fp2)
       {
          cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
          getch();
          exit(1);
       }
       for(int i = 0;i<16;i++)
        {
       while((temp = getc(fp1)) != EOF)
       {
          //ГЁГ*âåðòèðóåì ГЎГЁГІГ»
          coding1 = ~temp;
          //Èñêëþ÷Г*ГѕГ№ГҐГҐ ÈËÈ
          coding2 = coding1^code;
          //ÑëîæåГ*ГЁГҐ
          coding3 = coding2 + code;
          //Èñêëþ÷Г*ГѕГ№ГҐГҐ ÈËÈ Г± m
          coding4 = coding3^m;
 
          putc(coding4,fp2);
       };
       }
       fclose(fp1);
       fclose(fp2);
    }
    else
    {
        cout << "Ââåäèòå ГЇГ*ðîëü äëÿ Г°Г*ñøèôðîâêè: ";
        cin >> key1;
        cout << "\nkey = " << key1;
        k1 = strlen(key1);
        cout << "\nk1 = " << k1 << endl;
        for(int i=0;i<k1;i++)
        {
            code = (code + key1[i]);
        } 
        for(int i=1;i<k1;i++)
        {
            m = (key1[i-1] + key1[i])%64;
        }
        cout << "m = " << m << endl;
        cout << "\nÂâåäèòå èìÿ ГґГ*éëГ* äëÿ Г°Г*ñøèôðîâГ*Г*ГЁГї: ";
        cin >> filename1;
        fp3 = fopen(filename1, "rb");
        if (!fp3)
        {
        cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
        getch();
        exit(1);
        }
        cout << "\nÂâåäèòå èìÿ Г°Г*øèôðîâГ*Г*Г*îãî ГґГ*éëГ*: ";
        cin >> filename2;
        fp4 = fopen(filename2, "wb");
        if (!fp4)
        {
           cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
           getch();
           exit(1);
        }
        /*Г‡Г*ГЇГіГ±ГЄГ*ГҐГ¬ öèêë øèôðîâГ*Г*ГЁГї 16 Г°Г*Г§*/
        for(int i = 0;i<16;i++)
        {
           while((temp = getc(fp3)) != EOF)
           {
               coding1 = temp^m;
               coding2 = coding1 - code;
               coding3 = coding2^code;
               coding4 = ~coding3;
               putc(coding4,fp4);
           };
        }
        fclose(fp3);
        fclose(fp4);
    }
    cout << "END\n";
    MessageBox(NULL, "END", "END", MB_OK);
    getch();
    return 0;
}
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.06.2012, 07:37 #6
Я как то делал последовательно-циклическую ксорку с тремя ключами разной длины: каждый байт сообщения последовательно ксорится с байтами всех трехё ключей, а в пределах сообщения байты каждого ключа меняются циклически. И длина ключей не кратна. Специально брались три простых числа на длины: 2, 3 и 5 байт.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void Encode(uint8_t *Data, uint8_t *Key1, uint8_t *Key2, uint8_t Key3, unsigned long int Length)
{
 uint8_t *p;
 uint8_t *Last;
 int i;
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%2)
 {
  *p^=Key1[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%3)
 {
  *p^=Key2[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%5)
 {
  *p^=Key3[i];
 }
}
void Decode(uint8_t *Data, uint8_t *Key1, uint8_t *Key2, uint8_t Key3, unsigned long int Length)
{
 uint8_t *p;
 uint8_t *Last;
 int i;
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%5)
 {
  *p^=Key3[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%3)
 {
  *p^=Key2[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%2)
 {
  *p^=Key1[i];
 }
}
Добавлено через 5 минут
Фокус в том, что все три ключа эквивалентны одному 30-ти байтному с дырявым даиапазоном допустимых значений, но их суммарная длина всего 10 байт. И если не знать, что ключей 3, что они не распределены по собщению, как байты в обычной циклической ксорке, а вот так вот накладываются и какой они на самом деле длины, то можно долго подбирать варианты ключа, каких быть вообще не могло.

Добавлено через 30 минут
Есть ещё перестановочные шифры. В этих шифрах элементы сообщения не заменяются, а переставляются. Пропробуй прочитать: "рнёрп сотщвесыаЕф е еньчтеошыи". Но здесь все символы те же, что и в незашифрованнной версии, только ни перпутаны.

Добавлено через 1 минуту
Ключ - данное, описывающее перестановку. Можно переставлять не только элементы, имеющие смысл в исходном сообщении, но и байты многобайтных данных (в том числе, многобайтных кодов символов) и даже части байт, вплоть до перестановки отдельных бит.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 07:37
Привет! Вот еще темы с ответами:

Замена символов в файле - C++
кто нибудь может написать код программы : с консоли ввести путь к файлу и задать три группы по два любых символа ( например a-b, g-k, 1-3)....

Подсчёт символов в файле. - C++
Подскажите как посчитать количество символов в текстовом файле, какие функции для работы с файлами нужно использовать? Язык Си.

Подсчет символов в файле - C++
Всем привет! Прошу помощи) Надо написать программу, суть которой заключается вот в чем: программе дается файл *.txt, она считывает его...

Подсчет символов в файле - C++
Нужно найти сколько в файле букв (а,б,в...) алфавита. Не могу понять как делать. Начал с самого простого char alphabet = { 'А',...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.06.2012, 07:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru