2013-03-18 3 views
0

У меня есть следующий код. Однако файлы b.xlsx и c.xlsx имеют 0 байтов. Почему CipherOuputSteam не работает?CipherInputStream и CipherOutputStream не генерируют файлы

public static void main(String[] args) throws Exception { 

    KeyPair keys = KeyPairGenerator.getInstance("RSA").generateKeyPair(); 
    Cipher cipher = Cipher.getInstance("RSA"); 

    cipher.init(Cipher.ENCRYPT_MODE, keys.getPublic()); 

    FileInputStream fis; 
    FileOutputStream fos; 
    CipherOutputStream cos; 

    fis = new FileInputStream("C:/temp/a.xlsx"); 
    fos = new FileOutputStream("C:/temp/b.xlsx"); 

    cos = new CipherOutputStream (fos, cipher); 

    byte[] block = new byte[8]; 
    int i; 
    while ((i = fis.read(block)) != -1) { 
     cos.write(block, 0, i); 
    } 
    cos.close(); 
    fos.close(); 



    cipher.init(Cipher.DECRYPT_MODE, keys.getPrivate()); 
    CipherInputStream cis1, cis2; 
    fis = new FileInputStream("c:/temp/b.xlsx"); 
    CipherInputStream cis = new CipherInputStream(fis, cipher); 
    fos = new FileOutputStream("c:/temp/c.xlsx"); 

    while ((i = cis.read(block)) != -1) { 
     fos.write(block, 0, i); 
    } 
    fos.close(); 
    fis.close(); 
    cis.close(); 
} 
+0

Я бы начал с того, что попробовал гораздо больший буфер, чем 8 байтов, больше как 4096. 8-байтовый буфер, вероятно, делает невозможным выполнение CipherOutputStream. Если какое-либо исключение выбрано, вы должны отредактировать его и трассировку стека в свой пост. – EJP

+0

Это не помогло. Я использовал 4096, а также 10 000. Это не работает. – Satish

+0

Определите, что «не работает», пожалуйста. Подобные заявления на 100% бесполезны. – EJP

ответ

3

Проблема заключается в вашем использовании - что неправильно и в осуществлении CipherOutputStream маскирующий очень важное исключение - IllegalBlockSizeException.

Проблема заключается в том, что вы не можете использовать ключ RSA для шифрования данных, длина которых превышает размер ключа (что составляет 128 байтов в вашем примере). вы должны использовать симметричный алгоритм шифрования для больших блоков данных - например, AES.

Если вы хотите использовать асимметричные ключи по какой-либо причине (например, безопасная передача данных), вы можете найти хороший пример на этом SO answer.

Смежные вопросы