/// <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)); }
public override Asn1Object ToAsn1Object() { if (issuerSerial != null) { return(issuerSerial.ToAsn1Object()); } return(new DerTaggedObject(explicitly: false, 0, rKeyID)); }