2012-05-06 8 views
5

Ich habe kürzlich von blinden Signaturen gehört. Ich habe den Wikipedia-Artikel darüber gesehen, wie sie funktionieren, aber ich habe keine Lust, sie zu implementieren. Welche Bibliotheken (vorzugsweise kompatibel mit Linux und Windows) kann ich verwenden, um blinde Signaturen zu implementieren und zu überprüfen, ob die Datei signiert ist?Welche lib oder Software blind signieren und verifizieren?

ich versucht, Blick auf OpenSSL Mann Seiten, aber ich glaube nicht, dass blinde Signaturen http://www.openssl.org/docs/apps/dgst.html

unterstützt

Ich kann meine app entweder in C++ oder .NET und haben keine Probleme Laichen Prozess und Parsen ihre Ausgaben jedoch eine lib implementieren wäre über Software bevorzugt.

+0

Was brauchen Sie blinde Signaturen für? – imichaelmiers

Antwort

0

Sie benötigen keine spezielle Unterstützung für Blindsignaturen. Sie müssen lediglich in der Lage sein, eine Nachricht zu signieren und zu verifizieren. Der blinde Teil ist dem System unter Verwendung der asymmetrischen Chiffre überlassen. Das einfache Signieren von Inhalten, die Sie in einem speziellen Format erhalten, könnte eine blinde Unterschrift darstellen, die die Daten anzeigt, die Sie passieren, bevor Sie an einen anderen Ort gehen. Just make sure you don't use RSA

EDIT

Gemäß der erweiterten Diskussion in dieser Kommentare Antwort kann der obige Text je irreführend sein auf das, was Sie von speziell sprechen. Wenn Sie das blinde Signieren wie in den Kommentaren zu dieser Antwort beschrieben abschließen möchten, benötigen Sie spezielle Unterstützung. Ich würde sagen, wenn Sie etwas überprüft und getestet nicht finden, wäre es eine coole Übung oder ein Projekt, um Ihre eigenen zu implementieren und es auf GitHub oder dergleichen zu veröffentlichen.

+1

1) Welche blinde Signatur neben RSA würden Sie verwenden? Alle anderen blinden Signatur-Algos (z. B. Lucre) sind viel komplizierter und komischer. 2) blinde RSA-Signaturen sind bei richtiger Verwendung sicher. Verknüpfter Angriff erfordert eine unsachgemäße Verwendung. 3) Für blinde RSA-Signaturen benötigen Sie eine spezielle API, da die Standard-APIs Padding und Potenzierung in einem Schritt anwenden, während sie bei blinden Signaturen separat durchgeführt werden müssen.4) Der Rest der Post macht noch weniger Sinn, aber ich verstehe nicht wirklich, was Sie dort sagen wollen. Normale Signaturalgorithmen werden offensichtlich nicht geblendet. – CodesInChaos

+0

@CodesInChaos Es gibt keine wirklich korrekte Form für Blindsignaturen. Jeder Algorithmus kann beim Blindsignieren verwendet werden. Alles, was Sie tun müssen, um Blindsignaturen durchzuführen, ist das Akzeptieren von Nachrichten, das Signieren von Nachrichten und das Überprüfen signierter Nachrichten. In Ihrem Kommentar hat Punkt # 2 keine Informationen, nur Ihre Aussage. Punkt 3 ist albern wegen dem, was ich hier schon gesagt habe. Was Punkt Nr. 1 anbelangt, das wichtigste, würde ich traditionelles RSA mit Polsterung verwenden; Nachrichten würden in einer speziellen Form vorliegen und unter Verwendung eines unabhängigen symmetrischen Schlüssels verschlüsselt werden, um es tatsächlich blind zu machen. Blind Signaturen sind nützlich, um eine Kette von Handoffs zu beweisen –

+0

Ich verstehe überhaupt nicht, wie Sie einen Algorithmus für blinde Signaturen verwenden könnten. Der wichtige Teil einer Blindsignatur besteht darin, dass es unmöglich ist, die endgültige Signatur mit der Signaturanforderung zu verknüpfen. Dies bedeutet, dass die Nachricht, die beim Signieren angezeigt wird, und die Nachricht, die bei der Überprüfung angezeigt wird, keine erkennbaren Beziehungen haben, wenn Sie den geheimen Blindwert nicht kennen. Das einfache Signieren einer verschlüsselten Nachricht hat diese Unlinkability-Eigenschaft nicht. – CodesInChaos

1

Ich kann meine App in C++ oder .NET implementieren ... Was lib oder Software blind zu signieren und zu verifizieren?

Hier ist eine Crypto++ basierte Antwort. Crypto ++ ist eine Klassenbibliothek von Kryptogrammen, die von Wei Dai geschrieben wurden. Das Beispiel wurde im Wiki von Raw RSA | Blind Signatures übernommen.

Jack Lloyds Botan, die eine C++ 11 Crypto und TLS-Bibliothek ist, kann native Blindsignaturunterstützung haben.

Crypto ++ verfügt über keine Blindsignaturklassen. Das folgende Verfahren folgt dem Basisalgorithmus, wie er unter Blind Signatures beschrieben ist. Es unterscheidet sich jedoch von Wikipedia durch die Anwendung der s(s'(x)) = x Gegenprüfung. Die Gegenprobe war in Chaum's original paper vorhanden, aber es fehlt im Wiki-Artikel. Ein zweiter Unterschied zu Chaums Papier und Wikipedia ist, dass der folgende Code H(m) anstelle von m verwendet. Das liegt an Rabin in 1979.

Sie können zuerst eine Auffüllfunktion per Usability of padding scheme in blinded RSA signature? oder RSA blind signatures in practice anwenden. Siehe auch 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; 
} 

Hier das Ergebnis des Gebäudes ist und die Ausführung des Programms:

$ 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 
Verwandte Themen