diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index dc0e516..d6e191c 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -29,6 +29,14 @@ Changes:
 - Added support for DSA private keys (``BEGIN DSA PRIVATE``).
   This is also the OpenSSH legacy PEM format.
   `#49 <https://github.com/hynek/pem/issues/49>`_
+- Added support for ``pem.SSHPublicKey``
+  (``---- BEGIN SSH2 PUBLIC KEY ----``).
+  as defined in `RFC4716 <https://tools.ietf.org/html/rfc4716>`_.
+  `#46 <https://github.com/hynek/pem/pull/46>`_
+- Added support for ``pem.SSHCOMPrivateKey``
+  (``---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----``).
+  which is the SSH.com / Tectia private key format (plain or encrypted).
+  `#46 <https://github.com/hynek/pem/pull/46>`_
 
 
 ----
diff --git a/docs/api.rst b/docs/api.rst
index a5b5271..15bd5b0 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -35,6 +35,8 @@ The following objects can be returned by the parsing functions.
 .. autoclass:: ECPrivateKey(PrivateKey)
 .. autoclass:: DSAPrivateKey(PrivateKey)
 .. autoclass:: OpenSSHPrivateKey(PrivateKey)
+.. autoclass:: SSHPublicKey(Key)
+.. autoclass:: SSHCOMPrivateKey(PrivateKey)
 .. autoclass:: DHParameters(AbstractPEMObject)
 .. autoclass:: CertificateRequest(AbstractPEMObject)
 .. autoclass:: CertificateRevocationList(AbstractPEMObject)
diff --git a/setup.py b/setup.py
index 7ac45ec..978f42a 100644
--- a/setup.py
+++ b/setup.py
@@ -6,7 +6,6 @@ from setuptools import find_packages, setup
 
 
 ###############################################################################
-
 NAME = "pem"
 KEYWORDS = ["pyopenssl", "ssl", "tls", "pem", "cryptography", "twisted"]
 PROJECT_URLS = {
diff --git a/src/pem/__init__.py b/src/pem/__init__.py
index 4e91e5e..9e98a7e 100644
--- a/src/pem/__init__.py
+++ b/src/pem/__init__.py
@@ -14,6 +14,8 @@ from ._core import (
     PublicKey,
     RSAPrivateKey,
     RSAPublicKey,
+    SSHCOMPrivateKey,
+    SSHPublicKey,
     parse,
     parse_file,
 )
@@ -50,5 +52,7 @@ __all__ = [
     "RSAPublicKey",
     "parse",
     "parse_file",
+    "SSHCOMPrivateKey",
+    "SSHPublicKey",
     "twisted",
 ]
diff --git a/src/pem/_core.py b/src/pem/_core.py
index 7238c0d..ce57807 100644
--- a/src/pem/_core.py
+++ b/src/pem/_core.py
@@ -194,6 +194,25 @@ class OpenSSHPrivateKey(PrivateKey):
     """
 
 
+class SSHPublicKey(PublicKey):
+    """
+    A public key in SSH
+    `RFC 4716 <https://tools.ietf.org/html/rfc4716>`_ format.
+
+    The Secure Shell (SSH) Public Key File Format.
+
+    .. versionadded:: 21.1.0
+    """
+
+
+class SSHCOMPrivateKey(PrivateKey):
+    """
+    A private key in SSH.COM / Tectia format.
+
+    .. versionadded:: 21.1.0
+    """
+
+
 _PEM_TO_CLASS = {
     b"CERTIFICATE": Certificate,
     b"PRIVATE KEY": PrivateKey,
@@ -207,15 +226,19 @@ _PEM_TO_CLASS = {
     b"DH PARAMETERS": DHParameters,
     b"NEW CERTIFICATE REQUEST": CertificateRequest,
     b"CERTIFICATE REQUEST": CertificateRequest,
+    b"SSH2 PUBLIC KEY": SSHPublicKey,
+    b"SSH2 ENCRYPTED PRIVATE KEY": SSHCOMPrivateKey,
     b"X509 CRL": CertificateRevocationList,
 }  # type: Dict[bytes, Type[AbstractPEMObject]]
 
+# See https://tools.ietf.org/html/rfc1421
+# and https://tools.ietf.org/html/rfc4716 for space instead of fifth dash.
 _PEM_RE = re.compile(
-    b"-----BEGIN ("
+    b"----[- ]BEGIN ("
     + b"|".join(_PEM_TO_CLASS.keys())
-    + b""")-----\r?
+    + b""")[- ]----\r?
 .+?\r?
------END \\1-----\r?\n?""",
+----[- ]END \\1[- ]----\r?\n?""",
     re.DOTALL,
 )
 
@@ -223,7 +246,7 @@ _PEM_RE = re.compile(
 def parse(pem_str):
     # type: (bytes) -> List[AbstractPEMObject]
     """
-    Extract PEM objects from *pem_str*.
+    Extract PEM-like objects from *pem_str*.
 
     :param pem_str: String to parse.
     :type pem_str: bytes

diff --git a/tests/data.py b/tests/data.py
index bdc1bb5..92498b7 100644
--- a/tests/data.py
+++ b/tests/data.py
@@ -264,3 +264,30 @@ Qrb0riZLOXc966m9uXkBJE+Eimh+Jed/qfbwNuTZbxVz9rmsnbGHj8kvJT4c3J27
 NRrjPxY+c3X65vSaThscOQ0SHm5bRhX2YNRhgnZPznUnMXfE8yRLdgIUUS6kFIid
 HhSy7IHLTHWGoNdmwLo=
 -----END DSA PRIVATE KEY-----"""
+
+# Taken from https://tools.ietf.org/html/rfc4716#section-3.6.
+KEY_PEM_RFC4716_PUBLIC = br"""---- BEGIN SSH2 PUBLIC KEY ----
+Subject: me
+Comment: 1024-bit rsa, created by me@example.com Mon Jan 15 \
+08:31:24 2001
+AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
+596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
+soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=
+---- END SSH2 PUBLIC KEY ----
+"""
+
+# SSH.COM / Tectia private (encrypted or plain) key.
+# The non-encrypted key has the same armor.
+# puttygen -t rsa -O private-sshcom
+KEY_PEM_SSHCOM_PRIVATE = b"""\
+---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
+Comment: "rsa-key-20210120"
+P2/56wAAAUwAAAA3aWYtbW9kbntzaWdue3JzYS1wa2NzMS1zaGExfSxlbmNyeXB0e3JzYS
+1wa2NzMXYyLW9hZXB9fQAAAARub25lAAAA/QAAAPkAAAAGJQAAAf0VIAK0MvdpUXEG6obL
+3F5n0UimJWvwhJIb5AGyd++EdYvimCOg9iM2E75dDj89Ap7S5l4IS40fZO/5UjzYQxitAA
+ACAMNoGQLXcI4xVX/5Xt22aUBP4ADaJnDKR4H9D7LVZ4lBDUP8RBTmowCv9p3Hz7KvVw3R
+TX8BNF72gEuSOvruUAUAAAD9Hs7Zn1KbFR29ujFEv+d50/7rjMU7Ox4tzDeTSE6PBhsAAA
+EA3m/0JWkf61807iZ7AV8umYJMmNQ35HadG53n9nitpFEAAAEA4OQI1Rrh8e1EZ5qJBV8o
+gGyxzt4OdoXzuOtxkbHUB3U=
+---- END SSH2 ENCRYPTED PRIVATE KEY ----
+"""
diff --git a/tests/test_core.py b/tests/test_core.py
index 6dfa848..e76aef1 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -29,7 +29,9 @@ from .data import (
     KEY_PEM_PKCS8_ENCRYPTED,
     KEY_PEM_PKCS8_UNENCRYPTED,
     KEY_PEM_PUBLIC,
+    KEY_PEM_RFC4716_PUBLIC,
     KEY_PEM_RSA_PUBLIC,
+    KEY_PEM_SSHCOM_PRIVATE,
 )
 
 
@@ -525,6 +527,7 @@ class TestParse(object):
 
         assert isinstance(key, pem.PublicKey)
         assert isinstance(key, pem.RSAPublicKey)
+        assert KEY_PEM_RSA_PUBLIC == key.as_bytes()
 
     def test_generic_public_key(self):
         """
@@ -533,6 +536,7 @@ class TestParse(object):
         key = pem.parse(KEY_PEM_PUBLIC)[0]
 
         assert isinstance(key, pem.PublicKey)
+        assert KEY_PEM_PUBLIC == key.as_bytes()
 
     def test_ec_private_key(self):
         """
@@ -541,6 +545,7 @@ class TestParse(object):
         key = pem.parse(KEY_PEM_EC_PRIVATE)[0]
 
         assert isinstance(key, pem.ECPrivateKey)
+        assert KEY_PEM_EC_PRIVATE == key.as_bytes()
 
     def test_openshh_private_key(self):
         """
@@ -549,6 +554,7 @@ class TestParse(object):
         (key,) = pem.parse(KEY_PEM_OPENSSH)
 
         assert isinstance(key, pem.OpenSSHPrivateKey)
+        assert KEY_PEM_OPENSSH == key.as_bytes()
 
     def test_dsa_private_key(self):
         """
@@ -558,3 +564,26 @@ class TestParse(object):
         (key,) = pem.parse(KEY_PEM_DSA_PRIVATE)
 
         assert isinstance(key, pem.DSAPrivateKey)
+        assert KEY_PEM_DSA_PRIVATE == key.as_bytes()
+
+    def test_rfc4716_public_key_(self):
+        """
+        Detects and loads public SSH keys in RFC4716 format.
+        """
+        (key,) = pem.parse(
+            b"PREAMBLE \n" + KEY_PEM_RFC4716_PUBLIC + b"\n TRAILING"
+        )
+
+        assert isinstance(key, pem.SSHPublicKey)
+        assert KEY_PEM_RFC4716_PUBLIC == key.as_bytes()
+
+    def test_sshcom_private(self):
+        """
+        Detects and loads public SSH keys in RFC4716 format.
+        """
+        (key,) = pem.parse(
+            b"PREAMBLE \n" + KEY_PEM_SSHCOM_PRIVATE + b"\n TRAILING"
+        )
+
+        assert isinstance(key, pem.SSHCOMPrivateKey)
+        assert KEY_PEM_SSHCOM_PRIVATE == key.as_bytes()

Add support for RFC 4716 public and private keys
https://tools.ietf.org/html/rfc4716

Not sure if this is the right place to have this kind of support.... but since I saw support for OpenSSH.

Feel free to close this.

This is the SSH.com (Tectia) marker

```
—- BEGIN SSH2 PUBLIC KEY —-

Comment: "rsa-key-20160402"
AAAAB3NzaC1yc2EAAAABJQAAAgEAiL0jjDdFqK/kYThqKt7THrjABTPWvXmB3URI
pGKCP/jZlSuCUP3Oc+IxuFeXSIMvVIYeW2PZAjXQGTn60XzPHr+M0NoGcPAvzZf2
u57aX3YKaL93cZSBHR97H+XhcYdrm7ATwfjMDgfgj7+VTvW4nI46Z+qjxmYifc8u
VELolg1TDHWY789ggcdvy92oGjB0VUgMEywrOP+LS0DgG4dmkoUBWGP9dvYcPZDU
F4q0XY9ZHhvyPWEZ3o2vETTrEJr9QHYwgjmFfJn2VFNnD/4qeDDHOmSlDgEOfQcZ
Im+XUOn9eVsv//dAPSY/yMJXf8d0ZSm+VS29QShMjA4R+7yh5WhsIhouBRno2PpE
VVb37Xwe3V6U3o9UnQ3ADtL75DbrZ5beNWcmKzlJ7jVX5QzHSBAnePbBx/fyeP/f
144xPtJWB3jW/kXjtPyWjpzGndaPQ0WgXkbf8fvIuB3NJTTcZ7PeIKnLaMIzT5XN
CR+xobvdC8J9d6k84/q/laJKF3G8KbRGPNwnoVg1cwWFez+dzqo2ypcTtv/20yAm
z86EvuohZoWrtoWvkZLCoyxdqO93ymEjgHAn2bsIWyOODtXovxAJqPgk3dxM1f9P
AEQwc1bG+Z/Gc1Fd8DncgxyhKSQzLsfWroTnIn8wsnmhPJtaZWNuT5BJa8GhnzX0
9g6nhbk=
---- END SSH2 PUBLIC KEY ----

```

The marker for private keys is `---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ---`


tests/test_core.py::TestParse::test_rfc4716_public_key_ tests/test_core.py::TestParse::test_sshcom_private
tests/test_core.py::TestPEMObjects::test_cert_has_correct_repr tests/test_core.py::TestPEMObjects::test_cert_has_correct_str tests/test_core.py::TestPEMObjects::test_cert_req_has_correct_repr tests/test_core.py::TestPEMObjects::test_sha1_hexdigest[test] tests/test_core.py::TestPEMObjects::test_sha1_hexdigest[test\r] tests/test_core.py::TestPEMObjects::test_as_text tests/test_core.py::TestPEMObjects::test_cert_req_has_correct_str tests/test_core.py::TestPEMObjects::test_key_has_correct_repr tests/test_core.py::TestPEMObjects::test_key_has_correct_str tests/test_core.py::TestPEMObjects::test_rsa_private_key_has_correct_repr tests/test_core.py::TestPEMObjects::test_rsa_public_key_has_correct_repr tests/test_core.py::TestPEMObjects::test_rsa_key_has_correct_str tests/test_core.py::TestPEMObjects::test_dh_params_has_correct_repr tests/test_core.py::TestPEMObjects::test_dh_params_has_correct_str tests/test_core.py::TestPEMObjects::test_crl_has_correct_repr tests/test_core.py::TestPEMObjects::test_crl_has_correct_str tests/test_core.py::TestPEMObjects::test_certificate_unicode tests/test_core.py::TestPEMObjects::test_certificate_request_unicode tests/test_core.py::TestPEMObjects::test_key_unicode tests/test_core.py::TestPEMObjects::test_rsa_key_unicode tests/test_core.py::TestPEMObjects::test_dhparams_unicode_deprecated tests/test_core.py::TestPEMObjects::test_crl_unicode tests/test_core.py::TestPEMObjects::test_certs_equal tests/test_core.py::TestPEMObjects::test_cert_reqs_equal tests/test_core.py::TestPEMObjects::test_keys_equal tests/test_core.py::TestPEMObjects::test_rsa_keys_equal tests/test_core.py::TestPEMObjects::test_dh_params_equal tests/test_core.py::TestPEMObjects::test_crl_equal tests/test_core.py::TestPEMObjects::test_cert_contents_unequal tests/test_core.py::TestPEMObjects::test_cert_req_contents_unequal tests/test_core.py::TestPEMObjects::test_crl_unequal tests/test_core.py::TestPEMObjects::test_different_objects_unequal tests/test_core.py::TestPEMObjects::test_incompatible_types tests/test_core.py::TestParse::test_key_pkcs5_unencrypted tests/test_core.py::TestParse::test_key_pkcs5_encrypted tests/test_core.py::TestParse::test_key_pkcs8_unencrypted tests/test_core.py::TestParse::test_key_pkcs8_encrypted tests/test_core.py::TestParse::test_certificates tests/test_core.py::TestParse::test_certificate_no_new_line tests/test_core.py::TestParse::test_certificates_no_new_line tests/test_core.py::TestParse::test_dh tests/test_core.py::TestParse::test_crl tests/test_core.py::TestParse::test_file tests/test_core.py::TestParse::test_loads_certifi tests/test_core.py::TestParse::test_allows_lf tests/test_core.py::TestParse::test_rsa_public_key tests/test_core.py::TestParse::test_generic_public_key tests/test_core.py::TestParse::test_ec_private_key tests/test_core.py::TestParse::test_openshh_private_key tests/test_core.py::TestParse::test_dsa_private_key