2012-05-06 6 views
5

最近私は盲目の署名を聞いた。私はウィキペディアの記事がどのように機能しているのか見ていましたが、実装する気がしません。ブラインド署名を実装し、ファイルが署名されていることを検証するために、どのライブラリ(LinuxやWindowsと互換性があることが好ましい)を使用できますか?盲目的に署名して検証するためのlibまたはソフトウェアはありますか?

私は、OpenSSLのmanページを見てみましたが、私はそれがhttp://www.openssl.org/docs/apps/dgst.html

私はC++や.NETのいずれかで私のアプリを実装し、しかしlibがプロセスを生成し、その出力を解析することは問題を持つことはできませんブラインド署名をサポートしていないと思いますソフトウェアよりも好まれるだろう。

+0

あなたがのためのブラインド署名を何が必要ですか? – imichaelmiers

答えて

0

あなたは盲目の署名を特別にサポートする必要はありません。メッセージに署名して確認するだけで済みます。ブラインド部分は、非対称暗号を使用するシステムまでです。あなたが特別なフォーマットで受け取ったコンテンツに署名するだけで、どこかに行く前にあなたを通過したデータを示す盲目的な署名ができます。この回答のコメントの拡張の議論を1としてJust make sure you don't use RSA

EDIT

、上記のテキストは、具体的で話している内容によって誤解を招く可能性があります。この回答のコメントに記載されているようにブラインド署名を完了させるつもりなら、実際に特別なサポートが必要です。私はあなたが何かを見直してテストすることができない場合は、自分自身を実装してGitHubなどに投稿するための素晴らしい演習やプロジェクトになると言います。

+1

1)RSA以外のどの盲目の署名を使用しますか?他のすべての盲目的徴候の藻類(例えばLucre)ははるかに複雑で奇妙です。 2)ブラインドRSA署名は、適切に使用されると安全です。リンクされた攻撃には不適切な使用が必要です。 3)ブラインド署名では、標準APIがパディングと累乗の両方を1つのステップで適用するのに対して、ブラインド署名では個別に実行する必要があるため、盲目的なRSAシグネチャの場合は特別なAPIが必要です。4)投稿の残りの部分はそれほど意味がありませんが、私はあなたがそこで言うことを本当に理解していません。明らかに、通常の署名アルゴリズムは盲目的ではありません。 – CodesInChaos

+0

@CodesInChaos盲目の署名には本当に正しい形式はありません。どのアルゴリズムもブラインド署名に使用できます。ブラインド署名を実行するために必要なのは、メッセージを受け取り、署名し、署名されたメッセージを確認することだけです。あなたのコメントでは、ポイント#2は情報がなく、あなたの声明だけです。ポイント#3は私がすでにここで述べたことのために愚かです。ポイント#1に関しては、最も重要なことですが、私は従来のRSAをパディングに使用します。メッセージは特殊な形式になり、実際には盲目的になるように独立した対称鍵を使用して暗号化されます。ブラインドシグネチャは、ハンドオフの連鎖を証明するのに便利です –

+0

ブラインドシグネチャのアルゴリズムをどのように使用するかは全く分かりません。ブラインド署名の重要な部分は、最終署名と署名要求をリンクすることは不可能であるということです。これは、署名するときに表示されるメッセージと、秘密の盲目的な値を知らない限り、検証時に見られるメッセージが識別可能な関係を持っていてはならないことを意味します。暗号化されたメッセージに署名するだけでは、そのリンク不可能性のプロパティはありません。 – CodesInChaos

1

C++または.NETのいずれかで私のアプリケーションを実装することができます...盲目的に署名して検証するには、どのようなlibやソフトウェアが必要ですか?

ここにはCrypto++に基づく回答があります。 Crypto ++はWei Daiによって書かれた暗号スキームのクラスライブラリです。例はwikiのRaw RSA | Blind Signaturesから取られました。

C++ 11暗号およびTLSライブラリであるJack LloydのBotanは、ネイティブブラインド署名をサポートしている可能性があります。

Crypto ++には盲目の署名クラスがありません。以下の方法は、Blind Signaturesで説明されている基本アルゴリズムに従います。ただし、Wikipediaとの相違点は、s(s'(x)) = xクロスチェックを適用することです。クロスチェックはChaum's original paperにありましたが、wikiの記事にはありません。 Chaumの論文とウィキペディアの2つ目の違いは、以下のコードはmではなくH(m)です。これはRabin in 1979に起因します。

最初にUsability of padding scheme in blinded RSA signature?またはRSA blind signatures in practiceに応じてパディング機能を適用することができます。参照してくださいここでIs there a standard padding/format for RSA Blind Signatures?


#include "cryptlib.h" 
#include "integer.h" 
#include "nbtheory.h" 
#include "osrng.h" 
#include "rsa.h" 
#include "sha.h" 
using namespace CryptoPP; 

#include <iostream> 
#include <stdexcept> 
using std::cout; 
using std::endl; 
using std::runtime_error; 

int main(int argc, char* argv[]) 
{ 
    // Bob artificially small key pair 
    AutoSeededRandomPool prng; 
    RSA::PrivateKey privKey; 

    privKey.GenerateRandomWithKeySize(prng, 64); 
    RSA::PublicKey pubKey(privKey); 

    // Convenience 
    const Integer& n = pubKey.GetModulus(); 
    const Integer& e = pubKey.GetPublicExponent(); 
    const Integer& d = privKey.GetPrivateExponent(); 

    // Print params 
    cout << "Pub mod: " << std::hex << pubKey.GetModulus() << endl; 
    cout << "Pub exp: " << std::hex << e << endl; 
    cout << "Priv mod: " << std::hex << privKey.GetModulus() << endl; 
    cout << "Priv exp: " << std::hex << d << endl; 

    // For sizing the hashed message buffer. This should be SHA256 size. 
    const size_t SIG_SIZE = UnsignedMin(SHA256::BLOCKSIZE, n.ByteCount()); 

    // Scratch 
    SecByteBlock buff1, buff2, buff3; 

    // Alice original message to be signed by Bob 
    SecByteBlock orig((const byte*)"secret", 6); 
    Integer m(orig.data(), orig.size()); 
    cout << "Message: " << std::hex << m << endl; 

    // Hash message per Rabin (1979) 
    buff1.resize(SIG_SIZE); 
    SHA256 hash1; 
    hash1.CalculateTruncatedDigest(buff1, buff1.size(), orig, orig.size()); 

    // H(m) as Integer 
    Integer hm(buff1.data(), buff1.size()); 
    cout << "H(m): " << std::hex << hm << endl; 

    // Alice blinding 
    Integer r; 
    do { 
     r.Randomize(prng, Integer::One(), n - Integer::One()); 
    } while (!RelativelyPrime(r, n)); 

    // Blinding factor 
    Integer b = a_exp_b_mod_c(r, e, n); 
    cout << "Random: " << std::hex << b << endl; 

    // Alice blinded message 
    Integer mm = a_times_b_mod_c(hm, b, n); 
    cout << "Blind msg: " << std::hex << mm << endl; 

    // Bob sign 
    Integer ss = privKey.CalculateInverse(prng, mm); 
    cout << "Blind sign: " << ss << endl; 

    // Alice checks s(s'(x)) = x. This is from Chaum's paper 
    Integer c = pubKey.ApplyFunction(ss); 
    cout << "Check sign: " << c << endl; 
    if (c != mm) 
     throw runtime_error("Alice cross-check failed"); 

    // Alice remove blinding 
    Integer s = a_times_b_mod_c(ss, r.InverseMod(n), n); 
    cout << "Unblind sign: " << s << endl; 

    // Eve verifies 
    Integer v = pubKey.ApplyFunction(s);  
    cout << "Verify: " << std::hex << v << endl; 

    // Convert to a string 
    size_t req = v.MinEncodedSize(); 
    buff2.resize(req); 
    v.Encode(&buff2[0], buff2.size()); 

    // Hash message per Rabin (1979) 
    buff3.resize(SIG_SIZE); 
    SHA256 hash2; 
    hash2.CalculateTruncatedDigest(buff3, buff3.size(), orig, orig.size()); 

    // Constant time compare 
    bool equal = buff2.size() == buff3.size() && VerifyBufsEqual(
     buff2.data(), buff3.data(), buff3.size()); 

    if (!equal) 
     throw runtime_error("Eve verified failed"); 

    cout << "Verified signature" << endl; 

    return 0; 
} 

は、建物の結果であり、プログラムを実行している:

$ g++ blind.cxx ./libcryptopp.a -o blind.exe 
$ ./blind.exe 
Pub mod: bbf62585f8486acbh 
Pub exp: 11h 
Priv mod: bbf62585f8486acbh 
Priv exp: 31c1280c6bb08635h 
Message: 736563726574h 
H(m): 2bb80d537b1da3e3h 
Random: 7db0ecdb0a09fad5h 
Blinded msg: a8bf62a25b7b4b53h 
Blind sign: 2646ab6b9d5b48dfh 
Check sign: a8bf62a25b7b4b53h 
Unblind sign: 418d211b9cbb2d00h 
Verify: 2bb80d537b1da3e3h 
Verified signature 
関連する問題