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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RSA java (help me please), Собственная реализация RSA на java 
:(
    Опции темы
igorka
Дата 23.12.2007, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
   BigInteger encrypt(byte [] message) throws Exception {
        byte[] block = new byte[2];
        ByteArrayOutputStream mes = new ByteArrayOutputStream();
        for(int i = 0; i < message.length; i+=2){
            System.arraycopy(message, i, block, 0, 2);
            byte [] tmp = new BigInteger(block).modPow(publicKey, modulus).toByteArray();
            if(tmp.length % 8 != 0)  {
              System.out.println("Dow! length = " + tmp.length);
            } 
            mes.write(tmp);  
        }       
        return new BigInteger(mes.toByteArray());
    }


Это дебаг версия функции кодирования. В качестве параметров функция принимает исходное сообщение(условно четной длинны).
Потом сообщение разбивается на блоки по два байта, и шифруется алгоритмом RSA. Длинна ключа(модуля) 64 бит, 8 байт.

Проблема заключается в том что раз от разу гуляет длина закодированого блока! 
для проверки добавлено условие if(tmp.length % 8 != 0)

Подозреваю что собака зарыта где-то в классе BigInteger. modPow() должна возвращать всегда числа одинаковой разрядности? или нет?
Что делать? Хелп ми плз.
PM MAIL   Вверх
igorka
  Дата 24.12.2007, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, что помогли  smile . Вот что у меня получилось, может кто будет страдать подобной хней и ему пригодится.
Канешна недостатков много, еще дорабатывать и дорабатывать, поэтому выслушаю все рекомендации.
Тестировал ключи вплоть до 8192 - полет нормальный.

Еще интересует вопрос по быстродействию, оптимальней будет брать блоки по два байта(или по одному?) как делал я, или 
брать блоки размером (РАЗМЕР_КЛЮЧА - 1), что будет быстрее?


Код
import java.math.BigInteger;
import java.security.SecureRandom;
import java.io.ByteArrayOutputStream;

public class RSA {
   private final static BigInteger one      = new BigInteger("1");
   private final static SecureRandom random = new SecureRandom();

   private BigInteger privateKey;
   private BigInteger publicKey;
   private BigInteger modulus;
   private final static int N = 64;

   // generate an N-bit (roughly) public and private key
   RSA() {
      BigInteger p;
      BigInteger q;
      BigInteger e;
      BigInteger d;
      do{ 
      p = BigInteger.probablePrime(N/2, random);
      System.out.println("p = " + p);
      q = BigInteger.probablePrime(N/2, random);
      System.out.println("q = " + q);
      }
      while(p == q);
      BigInteger phi = (p.subtract(one)).multiply(q.subtract(one));
      System.out.println("phi = " + phi);
      modulus    = p.multiply(q);                                  
      System.out.println("mod = " + modulus);
      e = new BigInteger("3");
       while(phi.gcd(e).intValue() > 1) e = e.add(new BigInteger("2"));
      d = e.modInverse(phi);
      System.out.println("e = " + e);
      System.out.println("d = " + d);
      publicKey = e;
      privateKey = d;
   }


   String encrypt(byte [] message) throws Exception {
        int blockSize = 2;
        byte[] block = new byte[blockSize];
        System.out.println("message length  = " + message.length );
        StringBuffer sb = new StringBuffer();
        ByteArrayOutputStream mes = new ByteArrayOutputStream();
        for(int i = 0; i < message.length; i+=blockSize){
            if(message.length == (i+1)){
              blockSize--;
              block = new byte[blockSize];
              System.out.println("block decrement!");
            }
            System.arraycopy(message, i, block, 0, blockSize);
            byte [] tmp = new BigInteger(block).modPow(publicKey, modulus).toByteArray();
            mes.write(tmp);
            sb.append(new BigInteger(tmp).toString(16)).append("\n");  
        }
        return sb.toString();       
    }


   String decrypt(String encrypted) throws Exception {
   System.out.println("N length   = " + modulus.bitLength()/8); 
   System.out.println("encrypted len   = " + encrypted.length());
        BigInteger block;
   ByteArrayOutputStream mes = new ByteArrayOutputStream();
        int i = 0;
        int j = 0;
        while(i < (encrypted.length()-1)){
         i++;
         if(encrypted.charAt(i) == '\n'){
          block = new BigInteger(encrypted.substring(j, i), 16);
          mes.write(block.modPow(privateKey, modulus).toByteArray());
      System.out.println("block = " + encrypted.substring(j, i) + "end" );
          j = i+1;
         }
          
        }
               
       return mes.toString();
   }

   public String toString() {
      String s = "";
      s += "public  = " + publicKey  + "\n";
      s += "private = " + privateKey + "\n";
      s += "modulus = " + modulus;
      return s;
   }
 
   public static void main(String[] args) {
      RSA key = new RSA();
    
      byte[] bytes = args[0].getBytes();
      BigInteger message = new BigInteger(bytes);
      try{
      System.out.println("message   = " + message);
      String encrypt = key.encrypt(bytes);
      System.out.println("encrpyted = " + encrypt);
      String decrypt = key.decrypt(encrypt);
      System.out.println("decrypted = " + decrypt);
    }
      catch(Exception e) {
        System.out.println("Exception" );
        e.printStackTrace();
      };
   }
}

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.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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