1

私はアンドロイドが初めてです。暗号化されたpng画像ファイルをsdカードにダウンロードし、復号化後に表示できるアプリケーションを実行しています。javax.crypto.IllegalBlockSizeException: last block incomplete in decryption image decryptionしかし、そのダウンロードしたイメージを復号化すると、「 」が表示されることに気付きました。すると、ダウンロードした画像のサイズが 0KB (オリジナル - 150KB) であることがわかりました。次に、暗号化された画像をブラウザからダウンロードして確認しました。元の画像サイズを取得しています。私の画像ダウンロードクラスに何か問題があると確信しています。しかし、私はそれを理解することはできません。私を助けてください。前もって感謝します。

画像ダウンロード AsyncTask クラス

public class DownloadImagesTask extends AsyncTask<String, Void, Bitmap>
{
    private String fileName;

    @Override
    protected Bitmap doInBackground(String... urls)
    {
        //Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        return download_Image(urls[0]);
    }

    @Override
    protected void onPostExecute(Bitmap result)
    {
        storeImage(result);

    }

    private Bitmap download_Image(String url)
    {
        Bitmap bm = null;
        File file = new File(url);
        fileName = file.getName();
        try
        {
            URL aURL = new URL(url);
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
        }
        catch (OutOfMemoryError e)
        {
            Log.e("Hub", "Error getting the image from server : " + e.getMessage().toString());
        }
        catch (IOException e)
        {
            Log.e("Hub", "Error getting the image from server : " + e.getMessage().toString());
        }

        return bm;
    }

    public void storeImage(Bitmap bm)
    {
        BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        String extStorageDirectory = CommonUtils.getDataFromPreferences("metaPath", "");

        Log.d("extStorageDirectory", extStorageDirectory);
        OutputStream outStream = null;

        File wallpaperDirectory = new File(extStorageDirectory);
        if (!wallpaperDirectory.exists())
        {
            wallpaperDirectory.mkdirs();
        }
        File outputFile = new File(wallpaperDirectory, fileName);
        if (!outputFile.exists() || outputFile.length() == 0)
        {
            try
            {
                outStream = new FileOutputStream(outputFile);
            }
            catch (FileNotFoundException e1)
            {
                e1.printStackTrace();
            }

            try
            {
                bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
                outStream.flush();
                outStream.close();
                Log.d("ScratchActivtiy", "Image Saved");

            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();

            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

(すべての画像は私によって暗号化されました。サーバーでホストしました。暗号化または復号化に問題はありません。テストしました。すべて正常に動作しています。)

暗号クラス

public class CryptClass
{

    public byte[] encrypt(String seed, byte[] cleartext) throws Exception
    {

        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] result = encrypt(rawKey, cleartext);
        //  return toHex(result);
        return result;
    }

    public byte[] decrypt(String seed, byte[] encrypted) throws Exception
    {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] enc = encrypted;
        byte[] result = decrypt(rawKey, enc);

        return result;
    }

    //done
    private byte[] getRawKey(byte[] seed) throws Exception
    {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed(seed);
        kgen.init(128, sr);
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

    private byte[] encrypt(byte[] raw, byte[] clear) throws Exception
    {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(clear);
        return encrypted;
    }

    private byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception
    {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }
}
4

1 に答える 1