Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация ГОСТ. Зашифрованный файл раздувается.В десятки 
V
    Опции темы
svyashennik
Дата 24.11.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



Реализую алгоритм шифрования ГОСТ. В общем, бьюсь над следующей проблемой. После выполнения шфрования, файл раздувается в десятки раз. Вроде прогоняю по шагам уже, и всё равно не пойму. Может не туда смотрю?
Код

#include "stdafx.h"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

void main()
{
    FILE *file;
    FILE *stream;

    int Larray[4];
    int Rarray[4];
    int key[32]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1};
    int sb[8][16]=  {4,10,9,2,13,8,0,14,6,11,1,12,7,15,5,3,
                    14,11,4,12,6,13,15,10,2,3,8,1,0,7,5,9,
                    5,8,1,13,10,3,4,2,14,15,12,7,6,0,9,11,
                    7,13,10,1,0,8,9,15,14,4,6,12,11,2,5,3,
                    6,12,7,1,5,15,13,8,4,10,9,14,0,3,11,2,
                    4,11,10,0,7,2,1,13,3,6,8,5,9,12,15,14,
                    13,11,4,1,3,15,5,9,0,10,14,7,6,8,2,12,
                    1,15,13,0,5,7,10,4,9,2,3,14,6,11,8,12};
    int piece[8];
    int countL=0;
    int countR=0;
    int j;
    
    unsigned long int L=0;
    unsigned long int R=0;
    unsigned long int tmpLR=0;
    unsigned long int tmpL=0;
    unsigned long int tmp=0;

    file=fopen("123.png","rb");
        fseek(file,0,SEEK_END);
        L=ftell(file);
    fclose(file);
        
    if(L%8!=0)
    {
        R=L;
        for(int i=0;i<8;i++)
        {
            R++;
                
            if(R%8==0)
            {
                R=R-L;
                file=fopen("123.png","ab");
                    
                for(int a=0;a<R;a++)
                {
                    fputc(R,file);
                }
                fclose(file);
                
                L=0;
                R=0;

                break;
            }            
        }
    }

    file=fopen("123.png","rb");
    stream=fopen("out","ab");
    
    while((tmp=fgetc(file))!=EOF)
    {
        if(countL<4)
        {
            Larray[countL]=tmp;
            countL++;
        }
        else

        if(countL>3&&countL<8)
        {
            Rarray[countR]=tmp;
            countR++;
            countL++;
        }
        
        if(countL==4)
        {
            j=3;
            tmp=0;
            L=0;

            for(int i=0; i<=3; i++)
            {
                tmp=Larray[i];
                tmpLR=tmp<<(8*j);
                L=L^tmpLR;
                j--;
            }

            tmpLR=0;
        }

        if(countL==8)
        {
            j=3;
            tmp=0;
            R=0;

            for(int i=0; i<=3; i++)
            {
                tmp=Rarray[i];
                tmpLR=tmp<<(8*j);
                R=R^tmpLR;
                j--;
            }

            tmpLR=0;
        }
        
        if(countL==8)
        {
            for(int i=0;i<32;i++)
            {
                int a=7;
                unsigned long int pieceMask=4026531840;
                unsigned long int pieceTmp=0;
                
                if(i==0)
                {
                    tmpL=L;
                }
                else
                {
                    tmpL=R;
                }

                R=(R+key[i])%4294967296;
                
                for(j=0;j<8;j++)
                {
                    pieceTmp=R&pieceMask;
                    pieceTmp=pieceTmp>>4*a;
                    a--;
                    piece[j]=pieceTmp;
                    pieceMask=pieceMask>>4;
                }

                for(a=0;a<8;a++)
                {
                    piece[a]=sb[a][piece[a]];
                }

                j=7;
                tmp=0;
                R=0;

                for(a=0;a<8;a++)
                {
                    tmp=piece[a];
                    tmpLR=tmp<<(4*j);
                    R=R^tmpLR;
                    j--;
                }
                
                tmpLR=0;
                
                R=(R<<11)|(R>>21);
                R=tmpL^R;
            }
            
            j=3;
            tmp=0;
            unsigned long int mask=4278190080;

            for(int i=0;i<4;i++)
            {
                tmp=L&mask;
                mask=mask>>8;
                tmp=tmp>>(8*j);
                j--;
                fputc(tmp,stream);
            }

            j=3;
            tmp=0;
            mask=4278190080;

            for(int i=0;i<4;i++)
            {
                tmp=R&mask;
                mask=mask>>8;
                tmp=tmp>>(8*j);
                j--;
                fputc(tmp,stream);
            }
        }
    }
    
    fclose(stream);
    fclose(file);
    
    printf("All done!");
    getchar();
}


Подазрение, всё же, вызывают вот эти строки:
Код

                R=(R<<11)|(R>>21);
                R=tmpL^R;


Из-за сдвига влево может в старшие биты записывается инфа, но из-за типа переменной, она должна обрезаться.

В остальном отдельные блоки вроде тестировал всё в норме. Может кто занимался этим вопросом? Подскажите плз. Прошу прощения если пишу криво, пишу так чтобы потом сам разобрался что написал=) Спасибо за понимание и подсказки.
PM MAIL ICQ   Вверх
WhKitten
Дата 24.11.2010, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



В алгоритме не разбирался. Но могу предположить в чём проблема.
Во первых ИМХО при шифровании мы исходный файл изменять не должны.
А во вторых, мне кажестя, что вместо:
Код
stream=fopen("out","ab");

должно быть
Код
stream=fopen("out","wb");


Операции << и >> к продвижению типов гарантировано не приводят.
PM MAIL   Вверх
svyashennik
Дата 24.11.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



Согласен, но другого мне ничего не пришло в голову, а именно, чтобы получить два блока по 32 бита. Вот и решил добавить в конец файла символы, чтобы потом их удалить. но это вроде работает без нареканий. Для этого собственно и использую "ab', а не "wb". Но спасибо за комент.
PM MAIL ICQ   Вверх
WhKitten
Дата 24.11.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Далее, читаем мы один символ из файла, а записываем 8?
см:
Код

            for(int i=0;i<4;i++)
            {
                tmp=L&mask;
                mask=mask>>8;
                tmp=tmp>>(8*j);
                j--;
                fputc(tmp,stream);
            }

            j=3;
            tmp=0;
            mask=4278190080;

            for(int i=0;i<4;i++)
            {
                tmp=R&mask;
                mask=mask>>8;
                tmp=tmp>>(8*j);
                j--;
                fputc(tmp,stream);
            }

PM MAIL   Вверх
svyashennik
Дата 24.11.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



Нет, у меня сначала всё записывается в массивы, "левый" и "правый" по 4 байта каждый. Далее идёт их шифрация. А этот кусок кода говорит о записи полученных результатов. Что то не додумался коменты оставить.  В общем вот.
PM MAIL ICQ   Вверх
WhKitten
Дата 24.11.2010, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



А если countL==8, то значение countL больше меняться не будет и описанный выше код с двумя for будет выполнятся для каждого последующего прочитанного символа.
PM MAIL   Вверх
svyashennik
Дата 25.11.2010, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



Спасибо большое, проблему нашёл, действительно, не обнулял счётчики=) Видимо две ночи без сна дают о себе знать. Тему закрываю.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0912 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.