1

pycrypto を使用して Python で鍵ペアを生成しました

key=RSA.generate(bit_size,os.urandom)

exportedPrivateKey = key.exportKey('PEM', None, pkcs=1).decode("utf-8")
exportedPublicKey = key.publickey().exportKey('PEM', None, pkcs=1).decode("utf-8")

メッセージのハッシュを取り、ハッシュに署名する小さなユーティリティを作成しました...

hash = MD5.new(json_info.encode("utf-8")).digest()
privateKey = RSA.importKey(USER_TOKEN_PRIVATE_KEY)
signature = privateKey.sign(hash,'')

次に、公開鍵を使用して、それが正常に検証されたことを確認する何かを書きました..トークンの署名は正常に機能します..

hash = MD5.new(packet.encode("utf-8")).digest()
publicKey = RSA.importKey(tokenPublicKey)

if publicKey.verify(hash, signature):
    return json.loads(packet)
else:
    return None

さて、これを Python だけでなく Java でも使用する必要があったため、同様のライブラリを Java に移植していましたが、問題が発生し始めました。つまり、私の検証は常に失敗します...

まず、エクスポートした PEM から PublicKey オブジェクトを作成します...

byte[] encoded = Base64.decodeBase64(USER_TOKEN_PUBLIC_KEY);

//decode the encoded RSA public key
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pubKey = kf.generatePublic(keySpec);

私は署名を取得することができ、それはまったく同じ署名であり、値はまったく同じ値にハッシュされます (よく似ています。java はバイトを符号付き整数として表し、python はそれらを符号なしとして表しますが、それらは同じですバイナリ表現)。しかし、署名の検証に常に失敗しているようです..これを行うために使用しているものは次のとおりです。

byte[] hash = hasher.digest(packet.getBytes("UTF-8"));

InputStream hashStream = new ByteArrayInputStream(hash);

final Signature sign = Signature.getInstance("MD5withRSA");
sign.initVerify(pubKey);

byte[] buffer = new byte[256];
int length;
while ((length = hashStream.read (buffer)) != -1)
    sign.update (buffer, 0, length);

hashStream.close();

System.out.println(sign.verify(signature.getBytes("UTF-8")));

残念ながら、これは false しか出力しません。

私が実際に確認できる唯一の違いは、Java で検証するために渡すと、long 型の配列が要求されるのに対し、Python ではバイト シーケンスが要求されることです。私の最善の推測は、その long の文字列表現を取得して、それを一連のバイトに変換することでしたが、それは失敗しました。私の他の試みもすべて失敗しました(基になる大きな整数のバイト表現を見て、配列のバイト表現を見てください)。本当にシンプルなものが欠けているように感じますが、私の人生では、それが何であるかを理解できません...

署名がどのように見えるかの例として、Python では次のように表示されます。

[688304594898632574115230115201042030356261470845487427579402264460794863484312‌​120410963342371307037749493750151877472804877900061168981924606440672704577286260‌​395240971170923041153667805814235978868869872792318501209376911650132169706471509‌​89646220735762034864029622135210042186666476516651349805320771941650]

4

1 に答える 1