Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с цыфровой подписью


Автор: vffka 26.5.2009, 17:46
Доброго времени суток. Ребята, пишу диплом, одна из составных - проверка электронно-цифровой подписи. Когда создаю подпись и сразу ее проверяю, все нормально работает 
Код

String sData = "This is some text";
byte[] data = sData.getBytes();
        
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");
            kpg.initialize(1024);
            KeyPair keyPair = kpg.generateKeyPair();
            PrivateKey privateKey = keyPair.getPrivate();
            PublicKey publicKey = keyPair.getPublic();
                                            
            Signature dsa = Signature.getInstance("DSA");
            
            dsa.initSign(privateKey);
            dsa.update(data);
            byte[] sig = dsa.sign();
                        
            dsa.initVerify(publicKey);
            
            dsa.update(data);
            boolean verifies = dsa.verify(sig);
            System.out.println("signature verifies: " + verifies);        

Тут все норм работает, выдает 'true'. Но при попытке записи ЭЦП(электронной подписи) в файл и считывание ее от туда,  выдает 'false'.
Вот код
Код

KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");
        kpg.initialize(1024);
        KeyPair keyPair = kpg.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();
                                        
        Signature dsa = Signature.getInstance("DSA");
        dsa.initSign(privateKey);
        
        FileInputStream fRead = new FileInputStream(new File("D:\\test\\plainText.txt"));
        byte[] buffer = new byte[8192];
        int lenght;
        while((lenght = fRead.read(buffer)) != -1) {
            dsa.update(buffer, 0, lenght);
        }
        byte[] sig = dsa.sign();
        fRead.close();
        
        
        File file1 = new File("D:\\test(OnlySignature).txt");
        FileOutputStream fOut = new FileOutputStream(file1);
        fOut.write(sig);
        fOut.close();
        
        FileInputStream fIn = new FileInputStream(file1);
        byte[] data = new byte[fIn.available()];
        fIn.read(data);
        fIn.close();
        
        dsa.initVerify(publicKey);
        dsa.update(data);
        boolean verifies = dsa.verify(sig);
        System.out.println("signature verifies: " + verifies);        

В чем проблема, ума не приложу.... Подскажите пожалуйста кто знает

Автор: LSD 26.5.2009, 19:45
Тебе нужно читать не до fIn.available(), а до тех пор пока fIn.read() не вернет -1. А размер фала узнать можно через file1.length().

Автор: vffka 26.5.2009, 19:47
Спасибо, сейчас попробую

Добавлено через 14 минут и 13 секунд
если ты так имел ввиду: 
Код

 FileInputStream fIn = new FileInputStream(file1);
        int n;
        while((n = fIn.read()) != -1) {
         dsa.update((byte)n);
        }
        fIn.close();

все равно

Автор: garbuz 26.5.2009, 21:34
vffka, а если не секрет, что за тема диплома? Можно ответить в личку smile

Автор: LSD 27.5.2009, 12:47
Код

    FileInputStream fileIn = null;
    try
    {
      File file = new File("data.bin");
      fileIn = new FileInputStream(file);
      final int fileSize = (int) file.length();
      byte[] fileData = new byte[fileSize];
      int read;
      int pos = 0;
      while(pos < fileSize && (read = fileIn.read(fileData, pos, fileSize - pos)) != -1)
      {
        pos += read;
      }
    }
    finally
    {
      if(fileIn != null)
      {
        fileIn.close();
      }
    }

Ну или:
Код

    DataInputStream fileIn = null;
    try
    {
      File file = new File("data.bin");
      fileIn = new DataInputStream(new FileInputStream(file));
      byte[] fileData = new byte[(int) file.length()];
      fileIn.readFully(fileData);
    }
    finally
    {
      if(fileIn != null)
      {
        fileIn.close();
      }
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)