Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2011, 12:06   #1
Mira-girl
Пользователь
 
Регистрация: 08.11.2009
Сообщений: 16
Вопрос Java + шифрование = проблема

Здраствуйте!

Есть класс, который шифрует и дешифрирует список объектов класса Person (обычный клас типа структуры, который хранит информацию о личности).
Код:
package api.storage;

import java.io.*;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;

import java.security.*;

import java.util.ArrayList;

import api.list.*;
import api.Person;

public class DataStorageCSVCoding implements IDataStorage
{
   private static Key key;
   private static Cipher cipher;
   private IvParameterSpec parameters;
   private String filename;
   
   static 
   {
      try
      {
         key = KeyGenerator.getInstance("DES").generateKey();
         cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
      }
      catch (NoSuchAlgorithmException ex)
      {
         ex.printStackTrace();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }
   
   public DataStorageCSVCoding(String filename)
   {
      this.filename = filename; 
   }
   
   @Override
   public void save(LinkedList<Person> list) throws IOException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException 
   {  
      cipher.init(Cipher.ENCRYPT_MODE, key);
      parameters = new IvParameterSpec(cipher.getIV());
      FileOutputStream outputFile = new FileOutputStream(filename+".txt");
      Iterator<Person> iterator = list.iterator();
      Person current;
      byte[] person; 
      while (iterator.hasNext())
      {
         current = iterator.next();
         person = (current.toString()).getBytes();
         outputFile.write(cipher.doFinal(person));
         outputFile.write("\r\n".getBytes());
      }
      outputFile.close();
   }

   @Override
   public LinkedList<Person> load() throws Exception, InvalidKeyException, InvalidAlgorithmParameterException
   {
      cipher.init(Cipher.DECRYPT_MODE, key, parameters);
      FileInputStream inputFile = new FileInputStream(filename+".txt");
      LinkedList<Person> list = new LinkedList<Person>();
      ArrayList<Byte> person = new ArrayList<Byte>();
      int c; 
      try
      {
         while ((c = inputFile.read()) != -1)
         {
            if (c == 13) continue;
            if (c == 10)
            {
               byte[] encodedBytes = new byte[person.size()];
               for (int i=0; i<person.size(); i++)
                  encodedBytes[i] = person.get(i).byteValue();
               byte[] recoveredBytes = cipher.doFinal(encodedBytes);
               list.add(list.size(), Person.fromString(new String(recoveredBytes)));
               person.clear();
            }
            else
            {
               person.add((byte) c);
            }
         }
      }
      catch (Exception ex)
      {
         ex.printStackTrace();
         throw new IncorrectFileFormatException();
      }
      inputFile.close();
      return list;
   }
}
Шифруются строки без проблем, но при дешифрировании получаю эксепшн javax.crypto.IllegalBlockSizeExcept ion: Input length must be multiple of 8 when decrypting with padded cipher.
И это при том, что использую PKCS5Padding...
Не знаю что делать, уже перерыла, кажется, весь интернет. Может кто-то сталкивался? Что я не так делаю?

Заранее благодарна за помощь!
Mira-girl вне форума Ответить с цитированием
Старый 08.04.2011, 01:40   #2
NixonKNR
Новичок
Джуниор
 
Регистрация: 08.04.2011
Сообщений: 2
По умолчанию

Кода много, читать долго( в вставить в проект - так его не достаточно)
Судя по ошибке "Input length must be multiple of 8 when decrypting" могу сказать что у вас неправильно определяется размер массива encodedBytes.
Возможно ошибка в строке
byte[] encodedBytes = new byte[person.size()];
Возможно поможет функция
cipher.getOutputSize(person.size())
NixonKNR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема - калькулятор в java bomber132 Помощь студентам 0 23.02.2011 18:56
Проблема с графиками в java Losb Помощь студентам 1 26.12.2010 16:48
Калькулятор(Java). Проблема вычислительных кнопок с "продолжением" действия. KirkMETAL Помощь студентам 1 05.06.2010 17:55
Проблема с нововведениями в Java 1.6 (аннотации) lexluther Общие вопросы по Java, Java SE, Kotlin 1 02.12.2008 10:02