2017-07-06 12 views
1

私はpyCrypto PKCS1_v1_5署名を使ってメッセージに署名しています。 (Original codeRSAがPythonでサインインし、JSで確認します

from Crypto.Signature import PKCS1_v1_5 
from Crypto.Hash import * 
from Crypto.PublicKey import RSA 
from Crypto import Random 
import base64 
import codecs 

private_key = """-----BEGIN RSA PRIVATE KEY----- 
MIICXAIBAAKBgQDtmBQTFLfaYOsio48B0Sbw4qMnaXJ7Qk4i1gzI+lgLIOPV0YyU 
fWMKgl24iJsGN6W5Vk+4GfDE7jKGkti9ZsswaJ/1Un+zFpXlVCOjEe9CZz3npIEK 
G8jJL1rwnBc2qPY3YD8jWBhLaPUgchbxUbe1Q2eKDmlRF7B8BzeNG4aVdQIDAQAB 
AoGBAK+x6Q5fIMHVL6vyxRqz3pb9EWdgm664Tm2GWff44EiCbti717gqrKWl18ZR 
Bkpnth5CzDq4vAn0ltpbFvmgXRmnUL8WsxigrL6tf2mcx4QAgcqr4B6er7X738lB 
UDSaEiSLmT/hr9Rg6H/P8IoP01tLKnj/gYQd5CVLkh/VD+dVAkEA9InBNnM5ViAM 
Aq7lL/+RWc+jfKnT9kWo+X0v7K8fD9/188K45G6zK/9X0J6Qj83dk1uni5QGx1i1 
VVBXIlUnqwJBAPi7AEl8nmmohrSsq8YHX6lTTy6EybSgQS4Qu3SBcVl2RoG89BLx 
kReqyTRGupZz/fNS9VfGFZU9VOHcFCeVl18CQEOiLgwvRjZp2qiLUtw5pSvf3+nE 
1tkQXzHRzAV8Ue0EFnR68MRNUcTjdJhAot8DIzt0aByUrmNIR67274KRZs0CQC1X 
kZ7T2+Dw+tV24L1x3Kt2Z2nYhRirWhZ2sGV1r18ao5HFC01kwglpddJUznDc5j90 
MQt2LbsN+ipOP1JT/8sCQE4qVh+TeYVd8aXSqlJaTsLZNzDMjmREYfuodmyZp5WR 
q1R6SaZoxQltHgTtK85QqhDxmmWPkR6jdNLDlIR0Bx4= 
-----END RSA PRIVATE KEY-----""" 

public_key = """"-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtmBQTFLfaYOsio48B0Sbw4qMn 
aXJ7Qk4i1gzI+lgLIOPV0YyUfWMKgl24iJsGN6W5Vk+4GfDE7jKGkti9ZsswaJ/1 
Un+zFpXlVCOjEe9CZz3npIEKG8jJL1rwnBc2qPY3YD8jWBhLaPUgchbxUbe1Q2eK 
DmlRF7B8BzeNG4aVdQIDAQAB 
-----END PUBLIC KEY-----""" 

message = 'To be signed' 
key = RSA.generate(1024) 
pub_key = key.publickey().exportKey(public_key) 
priv_key = key.exportKey(private_key) 

h = SHA256.new(message) 
print '-----------------' 
signer = PKCS1_v1_5.new(key) 
signature = signer.sign(h) 
print signature 
hexlify = codecs.getencoder('hex') 
m = hexlify(signature)[0] #<--- I am sending this hex signature to JS. 
#--------------Code below is to test the verify in python, n it works ! 
h = SHA256.new('To be signed') 
verifier = PKCS1_v1_5.new(key.publickey()) 
if verifier.verify(h, signature): 
    print "The signature is authentic." 
else: 
    print "The signature is not authentic." 

JSに確認するためにテストするため、私はthisデモサンプル・ページを使用しています。そのページに書かれている署名値は16進数で 'RSASSA-PKCS1-v1_5'のように16進数でなければなりません。なぜ署名を16進数に変換するのですか?

私はの固定鍵で署名を生成すると、署名が同じではないという、Pythonコードで奇妙なことに気付きました。これは正常ですか? JSでは毎回固定の署名をしてくれます。

注:JS DEMOのサンプルページに少し不具合があります。ソースコードに移動し、rsa.signStringをrsa.signに変更してください。また、rsa.verifyStringをrsa.verifyに変更します。彼のGithubでthis issueを募集しました。彼はすぐにそれを修正するつもりだと言いました。

+0

願っていますただここに投稿しました:) –

+0

@TimPietzckerあなたが右を望む:) –

答えて

1

これまで私が固定秘密鍵で署名を生成したとき、署名は同じではありません。これは正常ですか?

正常ではありません。 PKCS#1 v1.5では、署名は常に同じ秘密鍵で同じにする必要があります。

次のことを確認します。

  • SHA256ハッシュが正確両方で同じことが
  • を終了している私は、Pythonの専門家ではないんだけど、また、あなたがた場合)(RSA.generateを呼び出していることを奇妙なようですあなたは既に鍵を持っています

あなたのPythonコードが毎回異なる署名を与えていることを考えれば、私はその部分に集中して調査します。入力データで1バイトが異なる場合、生成されるハッシュは異なります。ハッシュが同じ入力データで変更されている場合は、Pythonコードで確認してください。

0

誰かが私にPythonコードをチェックするよう提案し、固定ノンプライベートキーとは違う署名を得るためにノーマルではないと答えました。私はどのような理由で彼が答えを削除したのか分からないが、彼の観察は正しかった。実際には私がキーのペアをPythonで取得していた方法は全く間違っています。毎回新しい鍵ペアを生成し、それをローカル変数pub_key & priv_keyにエクスポートしています。代わりに私はこのようなことをすべきです。このようにして

#key = RSA.generate(2048) 
#pub_key = RSA.publickey().exportKey(public_key) 
priv_key = RSA.importKey(private_key) 
pub_key = RSA.importKey(public_key) 

、私はこの固定秘密鍵の同じシグネチャを取得し、それは本当にJSコードの署名を照合します。私は、これは単なる使い捨て/ダミー秘密鍵あなたですD ...

+1

それは私の答えでした。あなたの鍵の大きさについても虚偽の所見がありましたので、私は答えを削除しました。私はそれを元に戻して、あなたがそれが役に立ったと思ったので少し言い直した:) – quinz

関連する問題