Пиша малко тестово приложение. Работата е там... Servlet изтегля всеки AES криптиран файл в моето настолно приложение. След това приложението ми за настолни компютри го дешифрира и записва на локален hdd. Работи добре като за двоично видео, изображения и т.н., но по някаква причина губя знаци от txt файлове. Доколкото мога да разбера, във всеки txt файл липсват неговите 128 крайни бита (това са 15 или 16 крайни знака).
Не знам защо се получава така, така че имам нужда от вашия съвет
Ето кода на сервлета:
final int BUFFER_SIZE = 4096;
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte buffer[] = new byte[BUFFER_SIZE];
for (int nread = 0; (nread = in.read(buffer)) != -1;) {
out.write(buffer, 0, nread);
}
out.flush();
out.close();
in.close();
И кодовият фрагмент на настолното приложение:
response = httpclient.execute(httppost);//it is HttpClient 4...
resEntity = response.getEntity();
InputStream in = resEntity.getContent();
in = new CipherInputStream(in, decipher);//maybe the aes block missing here...
FileOutputStream out= new FileOutputStream(path);
byte[] buffer = new byte[4096];
int numRead = 0;
while ((count = in.read(buffer)) != -1) {
out.write(buffer, 0, count);
}
out.flush();
out.close();
И така дешифрирам:
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
key = kgen.generateKey();
byte[] ivar = new byte[]
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
};
AlgorithmParameterSpec params = new IvParameterSpec(ivar );
dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, key, params );
... И ето фрагмента за качване на приложението за настолен компютър
HttpPost httppost = null;
HttpResponse response=null;
HttpEntity resEntity=null;
try {
File file = filePath;
fileLength=file.length();
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.
PROTOCOL_VERSION,
HttpVersion.HTTP_1_1);
String url="http://localhost:8080/testUrl";
httppost = new HttpPost(url);
String name=file.getName();
InputStreamBody inputStreamBody=new InputStreamBody(new FileInputStream(file),name);
MultiPartEntity multiPartEntity = new MultiPartEntity();
multiPartEntity .addPart("file-name", new StringBody(name, Charset.forName("UTF-8")));
multiPartEntity .addPart("file-stream", inputStreamBody);
и метода InputStreamBody writeTo (можете да видите документа тук http://hc.apache.org/httpcomponents-client-ga/httpmime/clover/org/apache/http/entity/mime/content/InputStreamBody.html). ..
byte[] ivar = new byte[]
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
};
...
AlgorithmParameterSpec params = new IvParameterSpec(ivar);
encipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
encipher .init(Cipher.ENCRYPT_MODE, key, params);
...
public void writeTo(final OutputStream out) throws IOException {
if (out == null) {
throw new IllegalArgumentException("Output stream may not be null");
}
try {
out = new CipherOutputStream(out, encipher );
int numRead = 0;
while ( (count = in.read(buf)) !=-1) {
out.write(buf, 0, count);
}
out.flush();
in.close();
}
catch (java.io.IOException e) {
}
}
Моля, помогнете ми с проблема с дешифрирането. Може би на бинарните файлове също липсват 128 бита, но това не е толкова забележително, освен съдържанието на текстови файлове :( Чух, че може да се случи поради затваряне на потоци с неправилна последователност или така, но не съм сигурен.
Чух, че може да е проблемът с дължината на съдържанието на InputStreamBody методът:
public long getContentLength() {
return -1;
}
Но как да зададете правилно модифицираната изходна дължина, ако "in.length!=out.length" поради криптирането (вижте метода writeTo)?
Моля, помогнете ми да поправя това
Всеки полезен коментар се оценява :)
catch (java.io.IOException e) {}
- това просто изяжда вашето изключение, без да разберете какво е то. Използвайте поне нещо катоcatch (java.io.IOException e) { e.printStackTrace(); }
(и вижте дали има нещо в изхода за грешка). - person Paŭlo Ebermann   schedule 02.04.2011