2016-04-07 9 views
2

私はPython cryptographyライブラリを使用しています。私はRSAで何かを暗号化する必要があります。 1つのことを除いて、すべて素晴らしい作品です。Python暗号ライブラリのmodulus n、private exponent、public exponentを抽出する

キーを生成するときに、modulus n、公開指数、およびプライベート指数を16進数形式で取得して、それらをカスタム形式のファイルに保存できるようにする必要があります。実際の世界での使用ではなく、私はクラス割り当てのためにそれをやっています。

私はRSAに関してはcryptographyのドキュメントをすべて検索しましたが、get_modulus_or_exponents()のような方法やそのようなことを暗示するものは見つかりませんでした。

私はこれらの数字を取得して考えることができる唯一の方法は、キーをシリアル化し、その後、subprocessopensslコマンドとこのような形でそれを読む:

Modulus (2048 bit): 
    00:98:10:23:16:ff:b6:f4:26:a2:42:a6:19:23:0e: 
    0f:27:4a:b9:43:3d:a0:4b:b9:1b:1a:57:92:dd:a8: 
    bc:5d:b8:6e:e6:7f:0f:2e:89:a5:77:16:d1:cf:44: 
    [...] 
    f3:0d:5b:90:6b:de:59:58:c9:f4:26:4a:61:b4:52: 
    21:1d 
Exponent: 65537 (0x10001) 

は、それを解析し、抽出物は、情報を必要としていました。

は、この回避策よりも(好ましくは cryptographyのツールを使用して)任意のより良い方法がある(私はドキュメントで何かを見逃しているが?)または cryptography本当に他の方法は、必要な情報を取得することはできませんか?

EDITは:

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives.asymmetric import rsa 

private_key = rsa.generate_private_key(public_exponent=65537, 
              key_size=self.key_size * 8, 
              backend=default_backend() 
              ) 
public_key = private_key.public_key() 
ciphertext = public_key.encrypt(message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()),algorithm=hashes.SHA1(),label=None)) 
+0

どのように暗号化を追加できますか? –

+0

実際には、私は '暗号化'のソースコードを調べ、バックエンドからそれらのメンバーにアクセスするためのプライベートメソッドを呼び出すことで別の回避策を見つけましたが、それは悪い、悪い、悪い習慣です。だから、私はまだ答えを探しています、多分私は本当にドキュメントで何かを逃した。 – dosvarog

+0

@PadraicCunningham何も特別なものではなく、docsの例と同じように、すぐにコードスニペットを追加します。 https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#encryption – dosvarog

答えて

2

あなたは何を参照しpublic_numbers()private_numbers()

public_key.public_numbers() 
private_key.private_numbers() 

良い方法を使用してアクセスできます。これは、私は、ドキュメントの例と基本的に同じ鍵を生成し、暗号化するために使用したコードです使用可能です:

In [13]: [a for a in dir(public_key) if not a.startswith("_")] 
Out[13]: ['encrypt', 'key_size', 'public_bytes', 'public_numbers', 'verifier'] 

In [14]: [a for a in dir(private_key) if not a.startswith("_")] 
Out[14]: 
['decrypt', 
'key_size', 
'private_bytes', 
'private_numbers', 
'public_key', 
'signer'] 


In [15]: [a for a in dir(private_key.private_numbers()) if not a.startswith("_")] 
Out[15]: ['d', 'dmp1', 'dmq1', 'iqmp', 'p', 'private_key', 'public_numbers', 'q'] 

In [16]: [a for a in dir(public_key.public_numbers()) if not a.startswith("_")] 
Out[16]: ['e', 'n', 'public_key'] 

In [17]: [a for a in dir(private_key.private_numbers().public_numbers) if not a.startswith("_")] 
Out[17]: ['e', 'n', 'public_key'] 

あなたはyoを参照してください実際に秘密鍵を使用するだけで、すべての属性に実際にアクセスできます。

関連する問題