別の StackOverflow ユーザーによって書かれた RSA 暗号化/復号化に関する説明に出会い、コードを実装しました。これまでのところ、暗号化に問題はありません。復号化も実装しましたが、これまでのところエラーは発生していません。
ただし、復号化のOutputStream.write
機能は、復号化されたはずのファイルをディレクトリに保存/書き込みすることではありません。エラーなしで実行されますが、暗号化とは異なり、ファイルは返されません。暗号化されたファイルを復号化として書き込むのと同じ方法を使用しますが、ファイルは返されません。これもエラーなく実行されます。
以下は私の復号化コードです。暗号化/復号化に異なるクラスを使用していることに注意してください。また、例とは異なり、loadkey
2 つのクラスの両方で関数を使用します。
参照として使用した回答へのリンク: Java クラスの RSA 暗号化の問題
私の復号化クラス:
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
try {
String key=jTextField2.getText();
String cleartextFile = "C:\\keys\\naan.docx";
String ciphertextFile = jTextField1.getText();
loadKey(new File(key), "C:\\keys\\private.key");
decrypt(new File(ciphertextFile), new File("cleartextFile"));
} catch (GeneralSecurityException ex) {
Logger.getLogger(OpenFileDec.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(OpenFileDec.class.getName()).log(Level.SEVERE, null, ex);
}
}
private PrivateKey readPrivateKeyFromFile(String keyFileName) throws Exception {
InputStream in = new FileInputStream(keyFileName);
ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));
try {
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey pubKey = fact.generatePrivate(keySpec);
return pubKey;
} catch (Exception e) {
throw new RuntimeException("Spurious serialisation error", e);
} finally {
oin.close();
}
}
public void loadKey(File in, String privateKeyFile) throws GeneralSecurityException, IOException {
try {
// read private key to be used to decrypt the AES key
byte[] encodedKey = new byte[(int)privateKeyFile.length()];
new FileInputStream(privateKeyFile).read(encodedKey);
// create private key
//PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
//KeyFactory kf = KeyFactory.getInstance("RSA");
//PrivateKey pk = kf.generatePrivate(privateKeySpec);
PrivateKey pk = this.readPrivateKeyFromFile(privateKeyFile);
// read AES key
pkCipher.init(Cipher.DECRYPT_MODE, pk);
aesKey = new byte[AES_Key_Size/8];
CipherInputStream is = new CipherInputStream(new FileInputStream(in), pkCipher);
is.read(aesKey);
aeskeySpec = new SecretKeySpec(aesKey, "AES");
} catch (Exception e) {
}
}
public void decrypt(File in, File out) throws IOException, InvalidKeyException {
aesCipher.init(Cipher.DECRYPT_MODE, aeskeySpec);
CipherInputStream is = new CipherInputStream(new FileInputStream(in), aesCipher);
FileOutputStream os = new FileOutputStream(out);
copy(is, os);
os.close();
}
private void copy(InputStream is, OutputStream os) throws IOException {
int i;
byte[] b = new byte[1024];
while((i=is.read(b))!=-1) {
os.write(b, 0, i);
new Thread(new thread1()).start(); //Start the thread
}
}