Как зашифровать InputStream с помощью JNCryptor
Я разрабатываю приложение для iPad и использую RNCryptor для шифрования и дешифрования на устройстве. Существует версия Java этого формата шифрования, доступная в форме JNCryptor.
Теперь у меня есть данные для чтения из InputStream, но я хочу зашифровать данные перед их чтением. Я нашел класс с именем CipherInputStream, который, кажется, делает именно то, что я ищу. Единственное, мне нужен Шифр (и Поставщик), чтобы указать метод шифрования, и я не знаю, как это сделать. Можно ли даже определить пользовательский поставщик?
У кого-нибудь есть предложения по альтернативным способам использования JNCryptor для шифрования InputStream?
3 ответа
В конце концов я написал класс для чтения InputStream, шифрования частей данных и записи в PipedOutputStream. Этот PipedOutputStream я тогда соединился с PipedInputStream, который я в конечном счете возвратил. Шифрование и запись в PipedOutputStream происходит в отдельном потоке, чтобы избежать взаимоблокировки.
PipedInputStream pin = new PipedInputStream();
PipedOutputStream pout = new PipedOutputStream(pin);
EncryptionPipe pipe = new EncryptionPipe(5, pout, in, cipher, mac, metaData);
//EncryptionPipe(int interval, OutputStream out, InputStream in
// ,Cipher cipher, Mac mac, byte[] metaData)
pipe.start();
return pin;
И в EncryptionPipe:
public class EncryptionPipe extends Thread {
...
@Override
public void run() {
try {
mac.update(metaData);
out.write(metaData);
byte[] buf = new byte[1024];
int bytesRead = 0;
byte[] crypted;
byte[] hmac;
while ((bytesRead = in.read(buf)) != -1) {
if (bytesRead < buf.length) {
//the doFinal methods add padding if necessary, important detail!
crypted = cipher.doFinal(buf, 0, bytesRead);
hmac = mac.doFinal(crypted);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bytes.write(crypted);
bytes.write(hmac);
crypted = bytes.toByteArray();
bytesRead = crypted.length;
bytes.close();
} else {
crypted = cipher.update(buf, 0, bytesRead);
mac.update(crypted, 0, bytesRead);
}
out.write(crypted, 0, bytesRead);
synchronized (this) {
this.wait(interval);
}
}
out.close();
...
}
}
}
JNCryptor v1.1.0 был выпущен вчера и обеспечивает поддержку потокового шифрования и дешифрования.
использование AES256JNCryptorInputStream
расшифровать и AES256JNCryptorOutputStream
зашифровать.
Вы можете использовать поставщик Java по умолчанию. Для создания экземпляра шифра вы бы использовали
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
При этом используются режимы AES и Cipher Block Chaining. CBC работает только с кратными 16 байтами, поэтому вы также указываете способ дополнить свой ввод кратными 16 байтами.
Вот еще пример кода AES, чтобы вы начали