@SuppressWarnings("unchecked")
  public static boolean isSigningKey(PGPPublicKey key) {
    if (key.getVersion() <= 3) {
      return true;
    }

    // special case
    if (key.getAlgorithm() == PGPPublicKey.RSA_SIGN) {
      return true;
    }

    for (PGPSignature sig : new IterableIterator<PGPSignature>(key.getSignatures())) {
      if (key.isMasterKey() && sig.getKeyID() != key.getKeyID()) {
        continue;
      }
      PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();

      if (hashed != null && (hashed.getKeyFlags() & KeyFlags.SIGN_DATA) != 0) {
        return true;
      }

      PGPSignatureSubpacketVector unhashed = sig.getUnhashedSubPackets();

      if (unhashed != null && (unhashed.getKeyFlags() & KeyFlags.SIGN_DATA) != 0) {
        return true;
      }
    }

    return false;
  }
  @SuppressWarnings("unchecked")
  public static boolean isEncryptionKey(PGPPublicKey key) {
    if (!key.isEncryptionKey()) {
      return false;
    }

    if (key.getVersion() <= 3) {
      // this must be true now
      return key.isEncryptionKey();
    }

    // special cases
    if (key.getAlgorithm() == PGPPublicKey.ELGAMAL_ENCRYPT) {
      return true;
    }

    if (key.getAlgorithm() == PGPPublicKey.RSA_ENCRYPT) {
      return true;
    }

    for (PGPSignature sig : new IterableIterator<PGPSignature>(key.getSignatures())) {
      if (key.isMasterKey() && sig.getKeyID() != key.getKeyID()) {
        continue;
      }
      PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();

      if (hashed != null
          && (hashed.getKeyFlags() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0) {
        return true;
      }

      PGPSignatureSubpacketVector unhashed = sig.getUnhashedSubPackets();

      if (unhashed != null
          && (unhashed.getKeyFlags() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0) {
        return true;
      }
    }
    return false;
  }
 public static String getAlgorithmInfo(PGPPublicKey key) {
   return getAlgorithmInfo(key.getAlgorithm(), key.getBitStrength());
 }