如何在 BouncyCastle 中向 ASN1EncodableVector 添加特定的“密钥”?

Posted

技术标签:

【中文标题】如何在 BouncyCastle 中向 ASN1EncodableVector 添加特定的“密钥”?【英文标题】:How to add specific "key" to an ASN1EncodableVector in BouncyCastle? 【发布时间】:2022-01-12 18:05:42 【问题描述】:

所以,我问了一个类似的问题before,但问题已经发生了变化。所以,我会给你一个完整的概述,然后我会问这个问题。

目前,我正在读取 .yml 文件并对其进行解析。然后我将数据存储在一个看起来像这样的 HashMap 中:

[p_table=[p_event/Name, p_fault/Name], 
s_table=[s_event/Name, s_fault/Name], 
r_table=[r_event/Name, r_fault/Name]]

现在,我知道如果我想使用 bouncycastle 创建扩展,我首先必须将我的所有数据添加到 ASN1EncodableVector 中。我正在做的是使用证书来告诉我的物联网事物他们可以订阅/发布/接收哪些主题。因此,我可以这样做:

while(iterator.hasNext()) 
            Entry<String, ArrayList<String>> entry = iterator.next();
            ASN1EncodableVector vector = new ASN1EncodableVector

            for(String val : entry.getValue())                 
                (vector).add(new DERUTF8String(val));
            
            allowedTables.add(new DERSequence(vector));
        

这只会添加数组列表中的值,例如 p_event/Name 或 p_fault/Name,我有没有办法指定这两个 DERUTF8String(s) 属于 p_table?或者在使用 .add 方法时我可以使用某种标识符吗?

所以代码可以像这样改变吗:

(vector).add(new DERUTF8String(val));

到:

(vector).add(new aConstructorToIdentifyWhatTheUTF8BelongsTo(entry.getKey()), new DERUTF8String(val));

【问题讨论】:

【参考方案1】:

您可以嵌套序列,即您可以为每个条目构建一个 DERSequence,然后将它们中的每一个添加到外部 ASN1EncodableVector 并从中制作最终序列。如果值的数量如您的示例中固定为 2,则内部序列可能包含 key/val/val。或者你可以有另一个序列来保存这些值,例如:

SEQUENCE 
  SEQUENCE 
    "p_table",
    SEQUENCE 
      "p_event/Name",
      "p_fault/Name",
    
  ,
  SEQUENCE 
    "s_table",
    SEQUENCE 
      "s_event/Name",
      "s_fault/Name",
      "s_other/Name",
    
  ,
  // and so on

【讨论】:

所以我要创建我的 DERSequence,用两个值填充它作为 ASN1EncoableVectors。然后将“p_table”添加到另一个 DERSequence。将带有值的 DERSequence 添加到带有键的序列中,然后如果我有更多级别,我可以继续将它们添加到无穷大? 基本上是的。 太棒了,祈祷我做对了...有什么方法可以打印出最终的 ASN1EncodableVector 以查看结构是否正确? 您应该得到一个*** DERSequence。可以使用 org.bouncycastle.asn1.util.ASN1Dump.dumpAsString 将其打印出来,或者您可以在序列上调用 getEncoded 并使用其他一些 ASN.1 工具来检查编码。

以上是关于如何在 BouncyCastle 中向 ASN1EncodableVector 添加特定的“密钥”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java 中使用 bouncycastle 生成具有主题替代名称的 CSR

使用 BouncyCastle 不推荐使用的方法进行贝宝按钮加密的 Java 代码 - 如何修复?

如何添加BouncyCastle的算法到Android

为 c# bouncycastle 编写 php MCrypt twofish

动态 bouncycastle 提供者注册失败

如何使用Bouncy Castle Crypto API来加密和解密数据