当前位置: 首页 > 知识库问答 >
问题:

通过Bouncy Castle提取GPG密钥使用标志

严成礼
2023-03-14

虽然PGPPublicKey类提供了IsEncryptionKey()方法来确定公钥的算法是否可用于加密目的(RSA_General,RSA_Encrypt,ELGAMAL_General,ELGAMAL_Encrypt),但仅此一项不足以选择有效的加密子密钥。

如GnuPG packet.h中所示,存在关于数据包中存储的公钥的预期用法的信息:

 41 /* Usage flags */
 42 #define PUBKEY_USAGE_SIG     GCRY_PK_USAGE_SIGN  /* Good for signatures. */
 43 #define PUBKEY_USAGE_ENC     GCRY_PK_USAGE_ENCR  /* Good for encryption. */
 44 #define PUBKEY_USAGE_CERT    GCRY_PK_USAGE_CERT  /* Also good to certify keys.*/
 45 #define PUBKEY_USAGE_AUTH    GCRY_PK_USAGE_AUTH  /* Good for authentication. */
 46 #define PUBKEY_USAGE_UNKNOWN GCRY_PK_USAGE_UNKN  /* Unknown usage flag. */
 47 #define PUBKEY_USAGE_NONE    256                 /* No usage given. */

我的问题是,鉴于Bouncy Castle不公开这些标志,在Java中从一个PublicKeyPacket中提取这个密钥使用信息的建议方法是什么?

共有1个答案

高增
2023-03-14

我想出来了。对于子孙后代来说,解决办法是:

// If Key Usage flags are present, we must respect them:
int keyFlagsEncountered = 0;
boolean keyUsageAllowsEncryption = false;

Iterator<PGPSignature> i = key.getSignatures();
while(i.hasNext()) {
    PGPSignature signature = i.next();
    int keyFlags = signature.getHashedSubPackets().getKeyFlags();
    keyFlagsEncountered += keyFlags;

    boolean isEncryptComms = (keyFlags & KeyFlags.ENCRYPT_COMMS) > 0;
    boolean isEncryptStorage = (keyFlags & KeyFlags.ENCRYPT_STORAGE) > 0;
    // Other KeyFlags available here (AUTHENTICATION, SIGN_DATA, CERTIFY_OTHER).

    if (isEncryptComms || isEncryptStorage) {
        keyUsageAllowsEncryption = true;
    }
}

// However, if Key Usage flags are not present (older key, or key generation process simply did not include the flags) 
// then we still attempt to use an encryption key using the existing methods:
keyUsageAllowsEncryption = keyFlagsEncountered == 0 || keyUsageAllowsEncryption;
 类似资料:
  • 我对使用bouncy-gpg和PCKS12密钥的加密和描述的实现有麻烦。现在我有了PCKS12密钥(扩展名:.p12)。从这个密钥,我能够获得公钥和私钥。否则,bouncy-gpg需要使用gpg密钥。如何在bouncy-gpg中使用p12文件?如果有任何建议,我将不胜感激。多谢了。

  • 我有一个全新的Linux Mint14安装。已安装Thunderbird&Enigmail。 我试着删除我的密钥并重新移植它。我试着改变各种设置。但我想不出问题出在哪里。我以前使用过Linux/Thunderbird/Enigmail,从来没有出现过这个错误。

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 问题内容: Doc缺少示例…您如何基于密钥使用? 尝试根据键插入。 将插入位置放在。 从文档… A,X,LO = 0,HI = LEN(a)中 插入 X 在 一个 按排序顺序。这等效于假设 a 已经排序。请记住,O(log n)搜索由缓慢的O(n)插入步骤主导。 用法示例: 我希望把后排序列表中使用。眼下看跌期权的......因为我不使用的钥匙,做插入…文档不显示做用钥匙插入。 问题答案: 这确实

  • 问题内容: 我正在尝试从JSON对象提取密钥。在这种情况下,JSON对象是通过对名为 SkyRock的 社交网站的API调用获得的,如下所示: 我基本上想将所有 post_id 值存储在ArrayList中。为了做到这一点,我试图从JSON对象中提取 密钥 ,并按如下方式进行: 问题是无法找到合适的变量类型,在其中我可以存储从 keyset() 方法获得的结果。 我尝试搜索答案,但是在大多数情况下

  • 以前有人这么做过吗?谢谢