Android で PDF ファイルを暗号化/復号化したい (ただし、これは Java の一般的な問題です)
キーを生成するための次のコードがあります。
public static 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;
}
暗号化されたファイルを書き込むための私のコード:
inStream = new BufferedInputStream(conn.getInputStream());
outFile = new File(path + fileName);
outStream = new BufferedOutputStream(new FileOutputStream(outFile), 4096);
byte[] data = new byte[4096];
String seed = "password";
byte[] rawKey = Utils.getRawKey(seed.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
int bytesRead = 0;
while((bytesRead = inStream.read(data, 0, data.length)) >= 0)
{
outStream.write(cipher.doFinal(data),0, bytesRead);
}
outStream.flush();
outStream.close();
inStream.close();
そして、それを復号化する(そして、新しい復号化されたファイルに保存する)私のコード:
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(tmp_file);
String seed = "password";
byte[] rawKey = Utils.getRawKey(seed.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
int b;
byte[] data = new byte[4096];
while((b = fis.read(data)) != -1) {
fos.write(cipher.doFinal(data), 0, b);
}
fos.flush();
fos.close();
fis.close();
私はstackoverflowで多くのことを読み、指示に従おうとしましたが、これは機能せず、次のエラーが発生しました:
javax.crypto.BadPaddingException: pad block corrupted at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCi
私は何を間違っていますか?PDFファイルに関連する特異性はありますか?