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 では次のように表示されます。
[68830459489863257411523011520104203035626147084548742757940226446079486348431212041096334237130703774949375015187747280487790006116898192460644067270457728626039524097117092304115366780581423597886886987279231850120937691165013216970647150989646220735762034864029622135210042186666476516651349805320771941650]