/// <summary>
/// RFC 3852의 EnvelopedData 구조체 중 KeyTransRecipientInfo 항목을 생성하고
/// 이를 이용해 RecipientInfo 구조체를 생성한다.
/// </summary>
/// <param name="x509_certificate2">키를 암호화하기 위한 공인인증서(국세청 공인인증서)</param>
/// <param name="random_key">암호화에 사용된 램덤 키</param>
/// <returns></returns>
private RecipientInfo GetKeyTransRecipientInfo(X509Certificate2 x509_certificate2, byte[] random_key)
{
// RecipientIdentifier 필드에는 누구의 공개키를 이용하였는지에 대한 정보가 들어간다.
// IssuerAndSerialNumber(ASN.1 형태) 데이터를 생성하기 위하여 파라미터로 전달받은 cert 를 Org.BouncyCastle.X509.X509Certificate 타입으로 변환한다.
X509CertificateParser _x509Parser = new X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate _bouncyCert = _x509Parser.ReadCertificate(x509_certificate2.GetRawCertData());
// IssuerAndSerialNumber 데이터를 생성한다.
Org.BouncyCastle.Asn1.Cms.IssuerAndSerialNumber _issuerAndSerial = new Org.BouncyCastle.Asn1.Cms.IssuerAndSerialNumber(_bouncyCert.IssuerDN, new DerInteger(_bouncyCert.SerialNumber));
// IssuerAndSerialNumber 데이터를 이용하여 RecipientIdentifier 형태의 데이터를 생성한다.
RecipientIdentifier _rid = new RecipientIdentifier(_issuerAndSerial.ToAsn1Object());
// 대칭키 알고리즘에 사용된 키를 암호화할 때 이용되는 암호화 알고리즘에 대한 OID
// 암호화 알고리즘 : RSA (비대칭 알고리즘)
// OID : 1.2.840.113549.1.1.1
AlgorithmIdentifier _keyEncryptionAlgorithm = new AlgorithmIdentifier(new DerObjectIdentifier("1.2.840.113549.1.1.1"));
// 랜덤키를 공개키를 사용해 암호화 한다.
RSACryptoServiceProvider _rsaCrypto = (RSACryptoServiceProvider)x509_certificate2.PublicKey.Key;
byte[] _byteEncryptedKey = _rsaCrypto.Encrypt(random_key, false); // 대칭키를 암호화
Asn1OctetString _encryptedKey = new BerOctetString(_byteEncryptedKey);
// KeyTransRecipientInfo 구조체를 생성, 설정한다.
KeyTransRecipientInfo _keyTransRecipientInfo = new KeyTransRecipientInfo(_rid, _keyEncryptionAlgorithm, _encryptedKey);
// KeyTransRecipientInfo 구조체를 이용하여 RecipientInfo를 생성 및 설정한다.
return(new RecipientInfo(_keyTransRecipientInfo));
}