私は、16 進形式の文字列を取得し、末尾に 8 個の 0 を追加し、gcrypt を使用して署名する既存のシステムを扱っています。署名を検証できるAndroid版を作ろうとしています。既存のシステムは機能しており、変更することはできません。頭をひっかいても、Androidバージョンを機能させることはできません。
両端は、署名されるデータの値、結果の署名のバイト、および使用される鍵について合意します。エラーは、署名されているデータの解釈にあると思われますが、それは正直わかりません。
"A5DA123456789B00000000"
C++ で Linux エンドに署名しているとしましょう。
#define FORMAT "(data\n (flags pkcs1)\n (hash sha1 #%s#))\n"
sprintf(blob, FORMAT, "A5DA123456789B00000000");
gcry_sexp_sscan(&keydata, NULL, blob, strlen(blob));
次に、keydata を 2 番目の引数として に渡しますgcry_pk_sign
。
Java の android エンドは、これを行います。
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(pubkey);
BigInteger bigData = new BigInteger("A5DA123456789B00000000", 16);
sig.update(bigData.toByteArray());
boolean pass = sig.verify();
pass は false になります。
私は Java で署名できますが、Java は署名は問題ないと言っています。Linux には、gcrypt 署名に問題がないことを示す C コードがあります。どこかで見逃した pkcs1 に関連するあいまいな設定はありますか? または、私が見逃している明らかなものはありますか?誰でも知っていますか?
前もって感謝します!