我们从Python开源项目中,提取了以下8个代码示例,用于说明如何使用cryptography.hazmat.primitives.asymmetric.rsa.rsa_crt_iqmp()。
def deserialize(self, data): pgp_key, _ = pgpy.PGPKey.from_blob(data) password = "" if self.password: password = self.password with pgp_key.unlock(password): key_material = pgp_key._key.keymaterial # https://tools.ietf.org/html/rfc4880#section-5.5.3 # "multiprecision integer (MPI) of RSA secret exponent d." self._d = key_material.d # "MPI of RSA secret prime value p." self._p = key_material.p # "MPI of RSA secret prime value q (p < q)." self._q = key_material.q self._iqmp = rsa.rsa_crt_iqmp(key_material.p, key_material.q) self._dmp1 = rsa.rsa_crt_dmp1(key_material.d, key_material.q) self._dmq1 = rsa.rsa_crt_dmq1(key_material.d, key_material.q) self._public_numbers = ErisPublic( e=key_material.e, n=key_material.n)
def test_privateBlobRSA(self): """ L{keys.Key.privateBlob} returns the SSH protocol-level format of an RSA private key. """ from cryptography.hazmat.primitives.asymmetric import rsa numbers = self.rsaObj.private_numbers() u = rsa.rsa_crt_iqmp(numbers.q, numbers.p) self.assertEqual( keys.Key(self.rsaObj).privateBlob(), common.NS(b'ssh-rsa') + common.MP(self.rsaObj.private_numbers().public_numbers.n) + common.MP(self.rsaObj.private_numbers().public_numbers.e) + common.MP(self.rsaObj.private_numbers().d) + common.MP(u) + common.MP(self.rsaObj.private_numbers().p) + common.MP(self.rsaObj.private_numbers().q) )
def fields_from_json(cls, jobj): # pylint: disable=invalid-name n, e = (cls._decode_param(jobj[x]) for x in ('n', 'e')) public_numbers = rsa.RSAPublicNumbers(e=e, n=n) if 'd' not in jobj: # public key key = public_numbers.public_key(default_backend()) else: # private key d = cls._decode_param(jobj['d']) if ('p' in jobj or 'q' in jobj or 'dp' in jobj or 'dq' in jobj or 'qi' in jobj or 'oth' in jobj): # "If the producer includes any of the other private # key parameters, then all of the others MUST be # present, with the exception of "oth", which MUST # only be present when more than two prime factors # were used." p, q, dp, dq, qi, = all_params = tuple( jobj.get(x) for x in ('p', 'q', 'dp', 'dq', 'qi')) if tuple(param for param in all_params if param is None): raise errors.Error( 'Some private parameters are missing: {0}'.format( all_params)) p, q, dp, dq, qi = tuple( cls._decode_param(x) for x in all_params) # TODO: check for oth else: # cryptography>=0.8 p, q = rsa.rsa_recover_prime_factors(n, e, d) dp = rsa.rsa_crt_dmp1(d, p) dq = rsa.rsa_crt_dmq1(d, q) qi = rsa.rsa_crt_iqmp(p, q) key = rsa.RSAPrivateNumbers( p, q, d, dp, dq, qi, public_numbers).private_key( default_backend()) return cls(key=key)
def compute_rsa_private_key(cls, p, q, e, n, d): """ Computes RSA private key based on provided RSA semi-primes and returns cryptography lib instance. @developer: tnanoba :param p: int :param q: int :param e: int :param n: int :param d: int :return: object """ # Computes: d % (p - 1) dmp1 = rsa.rsa_crt_dmp1(d, p) # Computes: d % (q - 1) dmq1 = rsa.rsa_crt_dmq1(d, q) # Modular inverse q of p, (q ^ -1 mod p) iqmp = rsa.rsa_crt_iqmp(p, q) public_numbers = rsa.RSAPublicNumbers(e, n) return rsa.RSAPrivateNumbers(p, q, d, dmp1, dmq1, iqmp, public_numbers).private_key(default_backend())
def serialize(self, name, comment, email): rsa_priv = RSAPriv() rsa_priv.e = MPI(self.public_numbers._e) rsa_priv.n = MPI(self.public_numbers._n) rsa_priv.d = MPI(self._d) rsa_priv.p = MPI(self._p) rsa_priv.q = MPI(self._q) # https://github.com/SecurityInnovation/PGPy/blob/f08afed730816e71eafa0dd59ce77d8859ce24b5/pgpy/packet/fields.py#L1116 rsa_priv.u = MPI(rsa.rsa_crt_iqmp(self._q, self._p)) rsa_priv._compute_chksum() pub_key_v4 = PrivKeyV4() pub_key_v4.pkalg = PubKeyAlgorithm.RSAEncryptOrSign pub_key_v4.keymaterial = rsa_priv pub_key_v4.update_hlen() pgp_key = pgpy.PGPKey() pgp_key._key = pub_key_v4 uid = pgpy.PGPUID.new(name, comment=comment, email=email) # FIXME: Should I add a "Signature" Packet? # FIXME: Should I add subkeys? pgp_key.add_uid( uid, usage={ KeyFlags.Sign, KeyFlags.EncryptCommunications, KeyFlags.EncryptStorage}, hashes=[ HashAlgorithm.SHA256, HashAlgorithm.SHA384, HashAlgorithm.SHA512, HashAlgorithm.SHA224], ciphers=[ SymmetricKeyAlgorithm.AES256, SymmetricKeyAlgorithm.AES192, SymmetricKeyAlgorithm.AES128], compression=[ CompressionAlgorithm.ZLIB, CompressionAlgorithm.BZ2, CompressionAlgorithm.ZIP, CompressionAlgorithm.Uncompressed]) if self.password: pgp_key.protect( self.password, SymmetricKeyAlgorithm.AES256, HashAlgorithm.SHA256) return str(pgp_key)
def _fromRSAComponents(cls, n, e, d=None, p=None, q=None, u=None): """ Build a key from RSA numerical components. @type n: L{int} @param n: The 'n' RSA variable. @type e: L{int} @param e: The 'e' RSA variable. @type d: L{int} or L{None} @param d: The 'd' RSA variable (optional for a public key). @type p: L{int} or L{None} @param p: The 'p' RSA variable (optional for a public key). @type q: L{int} or L{None} @param q: The 'q' RSA variable (optional for a public key). @type u: L{int} or L{None} @param u: The 'u' RSA variable. Ignored, as its value is determined by p and q. @rtype: L{Key} @return: An RSA key constructed from the values as given. """ publicNumbers = rsa.RSAPublicNumbers(e=e, n=n) if d is None: # We have public components. keyObject = publicNumbers.public_key(default_backend()) else: privateNumbers = rsa.RSAPrivateNumbers( p=p, q=q, d=d, dmp1=rsa.rsa_crt_dmp1(d, p), dmq1=rsa.rsa_crt_dmq1(d, q), iqmp=rsa.rsa_crt_iqmp(p, q), public_numbers=publicNumbers, ) keyObject = privateNumbers.private_key(default_backend()) return cls(keyObject)
def data(self): """ Return the values of the public key as a dictionary. @rtype: L{dict} """ if isinstance(self._keyObject, rsa.RSAPublicKey): numbers = self._keyObject.public_numbers() return { "n": numbers.n, "e": numbers.e, } elif isinstance(self._keyObject, rsa.RSAPrivateKey): numbers = self._keyObject.private_numbers() return { "n": numbers.public_numbers.n, "e": numbers.public_numbers.e, "d": numbers.d, "p": numbers.p, "q": numbers.q, # Use a trick: iqmp is q^-1 % p, u is p^-1 % q "u": rsa.rsa_crt_iqmp(numbers.q, numbers.p), } elif isinstance(self._keyObject, dsa.DSAPublicKey): numbers = self._keyObject.public_numbers() return { "y": numbers.y, "g": numbers.parameter_numbers.g, "p": numbers.parameter_numbers.p, "q": numbers.parameter_numbers.q, } elif isinstance(self._keyObject, dsa.DSAPrivateKey): numbers = self._keyObject.private_numbers() return { "x": numbers.x, "y": numbers.public_numbers.y, "g": numbers.public_numbers.parameter_numbers.g, "p": numbers.public_numbers.parameter_numbers.p, "q": numbers.public_numbers.parameter_numbers.q, } elif isinstance(self._keyObject, ec.EllipticCurvePublicKey): numbers = self._keyObject.public_numbers() return { "x": numbers.x, "y": numbers.y, "curve": self.sshType(), } elif isinstance(self._keyObject, ec.EllipticCurvePrivateKey): numbers = self._keyObject.private_numbers() return { "x": numbers.public_numbers.x, "y": numbers.public_numbers.y, "privateValue": numbers.private_value, "curve": self.sshType(), } else: raise RuntimeError("Unexpected key type: %s" % (self._keyObject,))