/// <summary> /// Encodes the RSAParameters as an asn1-encoded RSAPublicKey or RSAPrivateKey struct, as defined by PKCS#1 / rfc3447. /// </summary> /// <param name="rsa">The RSA.</param> /// <returns></returns> /// <remarks>Adapted from Mono.Security</remarks> public static byte[] EncodeAsAsn1(RSAParameters param) { ASN1 asn1; // See: http://tools.ietf.org/html/rfc3447 // - A.1.1 RSA public key syntax // - A.1.2 RSA private key syntax if (param.D == null) { // Emit a RSAPublicKey ASN.1 type. asn1 = new ASN1(0x30); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.Modulus)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.Exponent)); } else { // Emit a RSAPrivateKey ASN.1 type. asn1 = new ASN1(0x30); asn1.Add(new ASN1(0x02, new byte[1] { 0x00 })); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.Modulus)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.Exponent)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.D)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.P)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.Q)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.DP)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.DQ)); asn1.Add(ASN1Convert.FromUnsignedBigInteger(param.InverseQ)); } return(asn1.GetBytes()); }
/* * RSAPrivateKey ::= SEQUENCE { * version Version, * modulus INTEGER, -- n * publicExponent INTEGER, -- e * privateExponent INTEGER, -- d * prime1 INTEGER, -- p * prime2 INTEGER, -- q * exponent1 INTEGER, -- d mod (p-1) * exponent2 INTEGER, -- d mod (q-1) * coefficient INTEGER, -- (inverse of q) mod p * otherPrimeInfos OtherPrimeInfos OPTIONAL * } */ static public byte[] Encode(RSA rsa) { RSAParameters param = rsa.ExportParameters(true); ASN1 rsaPrivateKey = new ASN1(0x30); rsaPrivateKey.Add(new ASN1(0x02, new byte[1] { 0x00 })); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.Modulus)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.Exponent)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.D)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.P)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.Q)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.DP)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.DQ)); rsaPrivateKey.Add(ASN1Convert.FromUnsignedBigInteger(param.InverseQ)); return(rsaPrivateKey.GetBytes()); }
static public byte[] Encode(DSA dsa) { DSAParameters param = dsa.ExportParameters(true); return(ASN1Convert.FromUnsignedBigInteger(param.X).GetBytes()); }