我试图与Bouncycastle不正当地加密任意长度的消息。 (1.4+,C#)

这是我现在拥有的代码。它应该(但不)生成一个CMS消息,其中数据本身用AES256加密随机密钥,并且该密钥与公共密钥从中加密 keyPair.

keyPair 是RSA键(Rsakeyparameters)

public static byte[] Encrypt(byte[] input, AsymmetricCipherKeyPair keyPair)
{
    CmsEnvelopedDataGenerator generator = new CmsEnvelopedDataGenerator();

    // those two lines are certainly wrong.
    // I have no idea what the subKeyID parameter does
    byte[] subKeyId = new byte[] {};
    generator.AddKeyTransRecipient(keyPair.Public, subKeyId);

    CmsProcessableByteArray cmsByteArray = new CmsProcessableByteArray(input);
    CmsEnvelopedData envelopeData = 
      generator.Generate(cmsByteArray, CmsEnvelopedDataGenerator.Aes256Cbc);

    return envelopeData.GetEncoded();
}

是什么 subKeyId 参数 Encrypt 方法和需要什么价值?

有帮助吗?

解决方案

查看Bouncycastle源的emploweddatatest.cs文件中的trykekalgorithm。他们没有做addKeyTransRecipient,而是做addKekreCipient。

    public static byte[] Encrypt(byte[] input, AsymmetricCipherKeyPair keyPair)
    {
        CmsEnvelopedDataGenerator generator = new CmsEnvelopedDataGenerator();
        DerObjectIdentifier algOid = //initialize

        //Still trying to figure out kekId here.
        byte[] kekId = new byte[] { 1, 2, 3, 4, 5 };
        string keyAlgorithm = ParameterUtilities.GetCanonicalAlgorithmName("AES256");

        generator.AddKekRecipient(keyAlgorithm, keyPair.Public, kekId);

        CmsProcessableByteArray cmsByteArray = new CmsProcessableByteArray(input);
        CmsEnvelopedData envelopeData =
          generator.Generate(cmsByteArray, CmsEnvelopedDataGenerator.Aes256Cbc);

        return envelopeData.GetEncoded();
    }

编辑:我认为Kekid只是用于引用键的唯一标识符。只是一种“命名”钥匙的方法。因此,您可以拥有一本钥匙书,每个钥匙都有标识符。当您发送加密消息时,未加密的密钥标识符会告诉您使用哪个密钥来加密该消息。

这是第140页的关键标识符的一个很好的解释:[[http://books.google.com/books?id=Pgg-Es2j3UEC&pg=PA140&lpg=PA140&dq=understanding+key+identifiers+encrypt&source=bl&ots=nFg0BzM2ht&sig=Ux5sreXMKyuEEZu0uaxE7cXC1VI&hl=en&ei=JKKJStbHGJivtgffsNznDA&sa=X&oi=book_result&ct=result&resnum=6#v= Onepage&Q =&f = false] [1

这是另一本使用BouncycastLecrypto的书,但看起来它们只是撕下了单位测试源代码。他们已经解释了一点:[http://books.google.com/books?id=WLLAD2FKH3IC&pg=PA343&lpg=PA343&dq=CmsEnvelopedDataGenerator+AddKekRecipient&source=bl&ots=O9HinJm3yB&sig=K5Z99DIVWW4-0abPIFR7x4lzBhU&hl=en&ei=g6aJSrjeDuHktgennNjnDA&sa=X&oi=book_result&ct=result&resnum=6#v=onepage&q=CmsEnvelopedDataGenerator% 20 addkekrecipient&f = false] [2

其他提示

Aaronls对“与Java的开始密码学”的作者有点不公平,毕竟,他首先写了所有的单位测试...

正如其他评论者指出的那样,CMS使用证书,您不能仅通过公共密钥;必须可以通过“主题关键识别器”或“ IssuerandSerialNumber”来引用密钥。 AddKeyTransRecipient的两个替代方案允许这一点。如果这些术语对您没有任何意义,则可能需要在X.509上进行一些背景阅读。

要使用AES,使用不对称审理的按摩是不够的。

您应该使用X509证书,其中公共密钥由证书授权(CA)签名。

子钥匙是证书的属性,主题密钥标识符:

       (X509Certificate) cert.getSubjectUniqueID()

要加密静脉长度的消息,您应该仅使用AES来交换对称键盘字,并使用此键进行对称加密。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top