private static RsaKeyHelper TryResolvePrivateKeyWithNoFormatDeclare(string keyString, RsaKeyHelper.KeyFormat format) { try { string pkcs1 = RsaKeyHelper.FormatPrivateKey(keyString, format); var helper = RsaKeyHelper.FromPemKeyString(pkcs1); helper.RSACryptoServiceProvider(); return(helper); } catch (Exception ex) { return(null); } }
/// <summary> /// /// </summary> /// <param name="keyString">密钥字符串</param> /// <exception cref="InvalidKeyFormatException"></exception> /// <returns></returns> public static PemCertificate ReadFromKeyString(string keyString) { PemCertificate pemcert = new PemCertificate(); RsaKeyHelper helper = null; if (keyString.StartsWith("-----")) { helper = RsaKeyHelper.FromPemKeyString(keyString); } else { //纯密钥文本,不带声明格式 keyString = keyString.Replace("\r", "").Replace("\n", ""); if (Convert.FromBase64String(keyString).Length < 400) { keyString = RsaKeyHelper.FormatPublicKey(keyString); helper = RsaKeyHelper.FromPemKeyString(keyString); } else { helper = TryResolvePrivateKeyWithNoFormatDeclare(keyString, RsaKeyHelper.KeyFormat.pkcs1) ?? TryResolvePrivateKeyWithNoFormatDeclare(keyString, RsaKeyHelper.KeyFormat.pkcs8); } } if (helper == null) { throw new InvalidKeyFormatException("无法识别的PEM密钥格式"); } pemcert._provider = helper.RSACryptoServiceProvider(); return(pemcert); //byte[] res = null; //string type = pem.StartsWith(PEM_PRIVATE_KEY_HEADER) ? "RSA PRIVATE KEY" : pem.StartsWith(PEM_PUBLIC_KEY_HEADER) ? "PUBLIC KEY" : "PLAIN TEXT"; //if (type == "PLAIN TEXT") //{ // res = Convert.FromBase64String(pem); //} //else //{ // byte[] data = Encoding.UTF8.GetBytes(pem); // res = GetPem(type, data); //} //if (type.Equals("RSA PRIVATE KEY"))//私钥 //{ // pemcert._provider = DecodeRSAPrivateKey(res); //} //else if (type.Equals("PUBLIC KEY")) //{ // pemcert._provider = DecodeX509PublicKey(res); //} //else if (type.Equals("PLAIN TEXT")) //{ // if (res.Length == 608 || res.Length == 611 || res.Length == 1193) //PKCS#1 PRIVATE KEY,keysize=1024,bytes=608 // { // pemcert._provider = DecodeRSAPrivateKey(res); // } // else if (res.Length == 634 || res.Length == 635 || res.Length == 1217 || res.Length == 1218)//ASN.1 PRIVATE KEY // { // pemcert._provider = DecodeASN1PrivateKey(res); // } // else // { // pemcert._provider = DecodeX509PublicKey(res); // if (pemcert._provider == null) // { // pemcert._provider = DecodeRSAPrivateKey(res); // if (pemcert._provider == null) // { // pemcert._provider = DecodeASN1PrivateKey(res); // } // } // } //} //return pemcert; }