Недавно мне пришлось центрировать «скрытый» div (т. е. display: none;), в котором была встроена форма, которая должна была быть сосредоточена на странице. Я написал следующий jQuery для отображения скрытого div & amp; затем обновите CSS до автоматической сгенерированной ширины таблицы и измените маржу, чтобы центрировать ее. (Переключатель отображения запускается щелчком по ссылке, но этот код не обязательно отображался.)
ПРИМЕЧАНИЕ. Я использую этот код, потому что Google привел меня к этому решению переполнения стека и amp; все будет работать, за исключением того, что скрытые элементы не имеют ширины и amp; не могут быть изменены / центрированы до тех пор, пока они не будут показаны.
$(function(){
$('#inner').show().width($('#innerTable').width()).css('margin','0 auto');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inner" style="display:none;">
<form action="">
<table id="innerTable">
<tr><td>Name:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="submit"></td></tr>
</table>
</form>
</div>
Jozef прав.
Когда вы создаете шифр с параметрами по умолчанию, по умолчанию он имеет значение «RSA / ECB / PKCS1Padding». Вы должны явно указать заполнение, если вам не нравятся неприятные сюрпризы. Потому что другие поставщики безопасности могут иметь разные параметры по умолчанию. И вы никогда не знаете заранее, какие настройки безопасности имеют каждая конкретная JRE.
Таким образом, дополнение PKCS1 добавляет 11 байт к вашим исходным данным, увеличивая его с 117 байт до 128 байтов. Вы должны учитывать, что эти номера относятся к 1024-битным RSA-ключам (которые незначительно защищены) и будут отличаться для более длинных ключей. Поскольку вы загружаете ключ из файла, проверьте его длину.
@Test
public void testPadding() throws Exception {
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024, random);
KeyPair keyPair = keyGen.generateKeyPair();
/* constant 117 is a public key size - 11 */
byte[] plaintext = new byte[117];
random.nextBytes(plaintext);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] ciphertext = cipher.doFinal(plaintext);
System.out.println(plaintext.length + " becomes " + ciphertext.length);
}
Это выводит
117 becomes 128
И, наконец, рассмотрите возможность использования AES вместо RSA для шифрования файлов.
Итак, чтобы исправить проблему, вам необходимо использовать буфер размером с открытым ключом - 11 (117) для шифрования и размера открытого ключа (128) для дешифрования.
Изменить
outputFile.write(cipher.doFinal(buffer), 0, read);
-
outputFile.write(cipher.doFinal(buffer));
, поскольку чтение буфера составляет 117 байт, а размер doFinal - 128 байт.
Также вам необходимо буферизовать входные потоки. Когда вы читаете файл, это может быть медленным, а затем InputStream будет читать меньше данных, чем может содержать буфер. С помощью BufferedInputStream обеспечивается достаточное количество данных до того, как будет возвращен вызов чтения. Однако для дешифрования крайне важно иметь полный блок данных
InputStream inputEntry = new BufferedInputStream(originalZipFile.getInputStream(entry));
while((read = inputEntry.read(buffer)) != -1){
outputFile.write(cipher.doFinal(buffer), 0, read);
}
У вас здесь проблема. read
- размер открытого текста, который был прочитан, а не зашифрованный текст. Вы должны полностью удалить 2-й и 3-й параметры.
Это также пустая трата времени и пространства для написания зашифрованного текста в промежуточном файле. Просто напишите это прямо в поток zip.