Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> криптография, хэширование SHA, где то ошибка в методе 
:(
    Опции темы
Nodir
Дата 13.4.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



Доброго времени дня. Я собираюсь спросить о немножка больше чем просто вопрос (Незнаю можно-ли спросить о таком на форуме). Вопрос такой, я реализавал по криптографии->хэширование SHA (Secure Hash Algorithm), взял ссылку где полностью по шагово обьяснено алгоритм с примерами. У меня программа работает правильно до t=2 (т.е. для t=0 и t=1) страница 9 на прикрепленном файле, а дальше a, b, c, d, e различаются с данными, несмог найти где ошибка. Pls help если возможно.

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  FIPS_180_1___Secure_Hash_Standard.pdf 98,33 Kb
PM MAIL   Вверх
Alexandr87
Дата 14.4.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



я так думаю, свой код тоже нужно выложить.
PM Jabber   Вверх
Nodir
Дата 14.4.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



Код


public class SHA {
    private static int length=512, beforeLngth=448;
    private final static int bitsInCharacter = 8;
    private static int pieceLength = 0;
    
    public static void main(String[] args ){
        String[] binViewOfStr = toNormalBinaryString("abc");
        String allBinStr = "";
        for (int i=0; i<binViewOfStr.length; i++)
            allBinStr += binViewOfStr[i];
        String result = doHash(allBinStr);
        System.out.println("result = "+result);
    }
    
    private static String[] toNormalBinaryString(String txt){
        int length = txt.length();
        byte[] bt = new byte[length];
        String[] result = new String[length];
        try{
            bt = txt.getBytes("ASCII");
        } catch (Exception e){
            System.out.println("Some Error in get ASCII code");
        }
        StringBuffer stB;
        int delta=0;
        for (int i=0; i<bt.length; i++){
            stB = new StringBuffer(Integer.toString(bt[i], 2));
            stB.reverse();
         delta = bitsInCharacter-stB.length();
         if (delta != 0){
             for (int j=0; j<delta; j++)
                 stB.append('0');
         }
         stB.reverse();
         result[i] = stB.toString();
        }
        
        /*for (int i=0; i<length; i++){
            System.out.println("bt["+i+"] = "+bt[i]);
            System.out.println("result["+i+"] = "+result[i]);
        }*/
        return result;
    }
    
    private static String doHash(String txt){
        StringBuffer stB = new StringBuffer(txt);
        int realLength = stB.length();
        stB.append("1");
        int delta=0, size=0;
        int modLength = (realLength+1)%length;
        if (modLength>beforeLngth){
            modLength = beforeLngth-modLength;
            delta = length-modLength;
            for (int i=0; i<delta; i++)
                stB.append("0");
        } else {
            delta = beforeLngth-modLength;
            for (int i=0; i<delta; i++)
                stB.append("0");
        }
        stB.append(addition(realLength));
        size = Double.valueOf(stB.length()/length).intValue();
        StringBuffer[] M = new StringBuffer[size];
        int start=0, end=stB.length(), currentInd=0, indexCount=0, temp=0;
        //int loopCount = Double.valueOf(stB.length()/)
        while (start<end){
            M[indexCount] = new StringBuffer(stB.substring(start, start+length));
            start += length;
            indexCount++;
        }
        int h0, h1, h2, h3, h4, a, b, c, d, e;
        h0=0x67452301; h1=0xEFCDAB89;
        h2=0x98BADCFE; h3=0x10325476; h4=0xC3D2E1F0;
        
        String forDivStr = "";
        start=0; currentInd=0;
        String[] wStr = new String[80];
        int[] w = new int[80];
        for (int i=0; i<indexCount; i++){
            start=0;
            for (int j=0; j<16; j++){
                forDivStr = stB.substring(start, start+32).toString();
                start += 32;
                wStr[j]=Integer.toHexString(Integer.parseInt(forDivStr, 2));
                w[j]=Integer.parseInt(wStr[j], 16);
                //System.out.println("wStr["+j+"]="+wStr[j]);
            }
            for (int t=16; t<80; t++)
                w[t]=s(w[t-3]^w[t-8]^w[t-14]^w[t-16], 1);
            a=h0; b=h1; c=h2; d=h3; e=h4;
            for (int t=0; t<80; t++){
                temp = s(a, 5)+f(b, c, d, t)+e+w[t]+k(t);
                e=d; d=c; c=s(b, 30); b=a; a=temp;
                System.out.print("\nt = "+t+": "+Integer.toHexString(a)+"  ");
                System.out.print(Integer.toHexString(b)+"  ");
                System.out.print(Integer.toHexString(c)+"  ");
                System.out.print(Integer.toHexString(d)+"  ");
                System.out.print(Integer.toHexString(e)+"  ");
            }
            h0=h0+a; h1=h1+b; h2=h2+c; h3=h4+d; h4=h4+e;
        }
        String digest = "";
        digest += Integer.toHexString(h0)+" ";
        digest += Integer.toHexString(h1)+" ";
        digest += Integer.toHexString(h2)+" ";
        digest += Integer.toHexString(h3)+" ";
        digest += Integer.toHexString(h4)+" ";
        return digest;
    }
    private static String addition(int length){
        StringBuffer strB = new StringBuffer(Integer.toBinaryString(length));
        int uzun = 64;
        int delta = uzun-strB.length();
        if (delta>0){
            strB.reverse();
            for (int i=0; i<delta; i++)
                strB.append("0");
            strB.reverse();
        }
        return new String(strB);
    }
    private static int s(int son, int xona){
        return ((son<<xona)|(son>>32-xona));
    }
    private static int k(int t){
        int temp = 0;
        if ((t>=0)&&(t<=19)) temp=0x5A827999; 
        if ((t>=20)&&(t<=39)) temp=0x6ED9EBA1;
        if ((t>=40)&&(t<=59)) temp=0x8F1BBCDC;
        if ((t>=60)&&(t<=79)) temp=0xCA62C1D6;
        return temp;
    }
    private static int f(int b, int c, int d, int t){
        int result=0;
        if ((t>=0)&&(t<=19))  result=((b&c)|((~b)&d));
        if ((t>=20)&&(t<=39)) result=(b^c^d);
        if ((t>=40)&&(t<=59)) result=((b&c)|(b&d)|(c&d));
        if ((t>=60)&&(t<=79)) result=(b^c^d);
        return result;
    }
}


PM MAIL   Вверх
Nodir
Дата 19.5.2007, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.5.2006
Где: Bukhara --> T ashkent --> Seoul

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



Здраствуйте. Доработал этого метода используя этот источник "http://en.wikipedia.org/wiki/SHA_hash_functions" и он работает правильно дла всякого слова, исключая пустого сообщения. Ошибка такая, берем код ASCII для каждого символа сообщения которое имеет 8 битовою бинарную представления. В нашем случае сообщение пустое и мы будем добавлять '1' к бинарному представления слова после чего ещё 447 нулей '0' чтобы он стал кратным на 448. Потом 64 битовое представление длины первоначальнного сообщения, т.е. 64 нулей в нашем случае чтобы получить 512 битовой блок. Когда мы обрабатываем наш 512 битовой блок разделяя его на 32 битовые блоки и берем из них int значение для далнеещих обработок, наш первый блок получается равым на "10000000000000000000000000000000" а это выходить за пределами int'а, т.е 2147483648>2147483647. Пробовал делать метод со всеми long'ами но дает совсем другие результаты. Что делать? 
Новый код
Код


public class SHA_1 {
    private static int bitsInCharacter = 8;
    
    public static void main(String[] args){
        System.out.println(hash(""));//put message to hash() method as argument
        //it will not for ""
    }
    
    static String hash(String text){
        String[] bitView = toNormalBinaryString(text);
        String allStr = "";
        for (String s: bitView)
            allStr += s;
        //System.out.println("allStr.length() = "+allStr.length());
        String paddedStr = correctStr(allStr);
        String hash = doHash(paddedStr);
        return hash;
    }
    private static String doHash(String readyStr){
        
        //System.out.println("readyStr.length() = "+readyStr.length());
        
        int h0=0x67452301, h1=0xEFCDAB89, h2=0x98BADCFE;
        int h3=0x10325476, h4=0xC3D2E1F0, a, b, c, d, e;
        
//        long h0=0x67452301, h1=0xEFCDAB89, h2=0x98BADCFE;
//        long h3=0x10325476, h4=0xC3D2E1F0, a, b, c, d, e;
        
        int size = readyStr.length()/512;
        System.out.println("size = "+size);
        String[] pieces512 = new String[size];
        int currIndx=0, left=0, rigth=0;
        while (currIndx<size){
            pieces512[currIndx]=readyStr.substring(left, left+512);
            left += 512;
            currIndx++;
        }
        currIndx=0; left=0; rigth=0;
        String arr512="";
        int[] w = new int[80];
//        long[] w = new long[80];
        String[] wHexStr = new String[80];
        String piece32 = new String();
        int temp=0;
//        long temp=0;
        
        while (currIndx<size){
            System.out.println("Working for "+currIndx+" block of 512");
            arr512 = pieces512[currIndx];
            left=rigth=0;
            for (int i=0; i<16; i++){
                piece32 = arr512.substring(left, left+32);
                left += 32;
                System.out.print(piece32+"   ");
                wHexStr[i] = Integer.toHexString(Integer.parseInt(piece32, 2));
                w[i] = Integer.parseInt(wHexStr[i], 16);
//                wHexStr[i] = Long.toHexString(Long.parseLong(piece32, 2));
//                w[i] = Long.parseLong(wHexStr[i], 16);
                System.out.print("wHexStr["+i+"] = "); println(wHexStr[i]);
            }
            for (int j=16; j<80; j++){
                w[j]=leftRotate(w[j-3]^w[j-8]^w[j-14]^w[j-16], 1);
                wHexStr[j] = Integer.toHexString(w[j]);
//                wHexStr[j] = Long.toHexString(w[j]);
            }
            
            /*int myIndex = 0;
            for (String k: wHexStr){
                System.out.print("wHexStr["+myIndex+"]= ");
                println(k);
                myIndex++;
            }*/
            a=h0; b=h1; c=h2; d=h3; e=h4;
            for (int t=0; t<80; t++){
                temp = leftRotate(a, 5)+f(b, c, d, t)+e+w[t]+k(t);
                e=d; d=c; c=leftRotate(b, 30); b=a; a=temp;
//                System.out.print("\nt = "+t+": "+Long.toHexString(a)+"  ");
//                System.out.print(Long.toHexString(b)+"  ");
//                System.out.print(Long.toHexString(c)+"  ");
//                System.out.print(Long.toHexString(d)+"  ");
//                System.out.print(Long.toHexString(e)+"  ");
            }
            h0=h0+a; h1=h1+b; h2=h2+c; h3=h3+d; h4=h4+e;
            
            currIndx++;
        }
        String digest = "";
        digest += lastCorrect(Integer.toHexString(h0))+"";
        digest += lastCorrect(Integer.toHexString(h1))+"";
        digest += lastCorrect(Integer.toHexString(h2))+"";
        digest += lastCorrect(Integer.toHexString(h3))+"";
        digest += lastCorrect(Integer.toHexString(h4))+"";
        /*digest += lastCorrect(Long.toHexString(h0))+"";
        digest += lastCorrect(Long.toHexString(h1))+"";
        digest += lastCorrect(Long.toHexString(h2))+"";
        digest += lastCorrect(Long.toHexString(h3))+"";
        digest += lastCorrect(Long.toHexString(h4))+"";*/
        
        return digest;
    }
    private static String lastCorrect(String must8){
        while (must8.length()<8)
            must8 = "0"+must8;
        return must8;
    }
    private static int leftRotate(int number, int pos){
       return (number<<pos) | (number>>>(32-pos));
    }
    
    private static int k(int t){
        int temp = 0;
        if ((t>=0)&&(t<=19)) temp=0x5A827999; 
        if ((t>=20)&&(t<=39)) temp=0x6ED9EBA1;
        if ((t>=40)&&(t<=59)) temp=0x8F1BBCDC;
        if ((t>=60)&&(t<=79)) temp=0xCA62C1D6;
        return temp;
    }
    private static int f(int b, int c, int d, int t){
        int result=0;
        if ((t>=0)&&(t<=19))  result=((b&c)|((~b)&d));
        if ((t>=20)&&(t<=39)) result=(b^c^d);
        if ((t>=40)&&(t<=59)) result=((b&c)|(b&d)|(c&d));
        if ((t>=60)&&(t<=79)) result=(b^c^d);
        return result;
    }
    private static String correctStr(String str){
        int preLength = str.length();
        StringBuffer stBuf = new StringBuffer(str);
        stBuf.append('1');
        int afterLength = stBuf.length();
        int toCongurent512 = afterLength%512;
        int countZeros = (448-toCongurent512>0)?(448-toCongurent512):
                            (448+512-toCongurent512);
        int index = 0;
        while (index<countZeros){
            stBuf.append('0');
            index++;
        }
        StringBuffer myBin = new StringBuffer(
                Integer.toBinaryString(preLength));
        if (myBin.length()<64){
            myBin.reverse();
            while (myBin.length()<64){
                myBin.append('0');
            }
            myBin.reverse();
        }
        stBuf.append(myBin);
        return stBuf.toString();
    }
    
    private static void println(String str){
        int lngth = str.length(), index=0;
        while (index<8-lngth){
            System.out.print('0');
            index++;
        }
        System.out.print(str+"\n");
    }
    private static void println(int nt){
        println(String.valueOf(nt));
    }
    
    private static String[] toNormalBinaryString(String txt){
        int length = txt.length();
        byte[] bt = new byte[length];
        String[] result = new String[length];
        try{
            bt = txt.getBytes("ASCII");
        } catch (Exception e){
            System.out.println("Some Error in get ASCII code");
        }
        StringBuffer stB;
        int delta=0;
        for (int i=0; i<bt.length; i++){
            stB = new StringBuffer(Integer.toString(bt[i], 2));
            stB.reverse();
         delta = bitsInCharacter-stB.length();
         if (delta != 0){
             for (int j=0; j<delta; j++)
                 stB.append('0');
         }
         stB.reverse();
         result[i] = stB.toString();
        }
        
        /*for (int i=0; i<length; i++){
            System.out.println("bt["+i+"] = "+bt[i]);
            System.out.println("result["+i+"] = "+result[i]);
        }*/
        return result;
    }
}


Вот здесь пример зделанное кемто на JavaScript работает для всякого сообщение
PM MAIL   Вверх
AlexShek
Дата 11.3.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а почему бы вам не использовать хэширование из стандартных библиотек?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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