Bouncycastle:AddKeyTransRecipient的子钥匙派参数做什么?
-
12-09-2019 - |
题
我试图与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只是用于引用键的唯一标识符。只是一种“命名”钥匙的方法。因此,您可以拥有一本钥匙书,每个钥匙都有标识符。当您发送加密消息时,未加密的密钥标识符会告诉您使用哪个密钥来加密该消息。
这是另一本使用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来交换对称键盘字,并使用此键进行对称加密。