private byte[] fetchSymmetricKeyData(PGPPrivateKey privKey, Provider asymProvider) throws PGPException { Cipher c1 = getKeyCipher(keyData.getAlgorithm(), asymProvider); try { c1.init(Cipher.DECRYPT_MODE, privKey.getKey()); } catch (InvalidKeyException e) { throw new PGPException("error setting asymmetric cipher", e); } BigInteger[] keyD = keyData.getEncSessionKey(); if (keyData.getAlgorithm() == PGPPublicKey.RSA_ENCRYPT || keyData.getAlgorithm() == PGPPublicKey.RSA_GENERAL) { byte[] bi = keyD[0].toByteArray(); if (bi[0] == 0) { c1.update(bi, 1, bi.length - 1); } else { c1.update(bi); } } else { ElGamalKey k = (ElGamalKey) privKey.getKey(); int size = (k.getParameters().getP().bitLength() + 7) / 8; byte[] tmp = new byte[size]; byte[] bi = keyD[0].toByteArray(); if (bi.length > size) { c1.update(bi, 1, bi.length - 1); } else { System.arraycopy(bi, 0, tmp, tmp.length - bi.length, bi.length); c1.update(tmp); } bi = keyD[1].toByteArray(); for (int i = 0; i != tmp.length; i++) { tmp[i] = 0; } if (bi.length > size) { c1.update(bi, 1, bi.length - 1); } else { System.arraycopy(bi, 0, tmp, tmp.length - bi.length, bi.length); c1.update(tmp); } } byte[] plain; try { plain = c1.doFinal(); } catch (Exception e) { throw new PGPException("exception decrypting secret key", e); } if (!confirmCheckSum(plain)) { throw new PGPKeyValidationException("key checksum failed"); } return plain; }