2012-05-06 20 views
5

Gần đây tôi đã nghe thấy chữ ký mù. Tôi thấy bài viết wikipedia về cách họ làm việc nhưng không cảm thấy như thực hiện nó. Tôi có thể sử dụng thư viện nào (tốt nhất là tương thích với linux và windows) để thực hiện chữ ký mù và xác minh tệp được ký?Lib hoặc phần mềm nào để ký và xác minh một cách mù quáng?

Tôi cố gắng nhìn vào openssl trang người đàn ông nhưng tôi không nghĩ rằng nó hỗ trợ chữ ký mù http://www.openssl.org/docs/apps/dgst.html

tôi có thể thực hiện ứng dụng của tôi trong cả hai C++ hoặc .NET và không có vấn đề quá trình sinh sản và phân tích kết quả đầu ra của họ tuy nhiên một lib sẽ được ưu tiên hơn phần mềm.

+0

Những gì bạn cần chữ ký mù cho? – imichaelmiers

Trả lời

0

Bạn không cần bất kỳ hỗ trợ đặc biệt nào cho chữ ký mù. Bạn chỉ cần có thể ký và xác minh tin nhắn. Phần mù là hệ thống sử dụng mật mã không đối xứng. Việc chỉ cần ký nội dung bạn nhận được theo một định dạng đặc biệt có thể cấu thành việc ký mù, cho biết dữ liệu được truyền qua bạn trước khi đi đến một nơi khác. Just make sure you don't use RSA

EDIT

Theo các cuộc thảo luận kéo dài trong ý kiến ​​của câu trả lời này, các văn bản trên có thể gây hiểu lầm tùy thuộc vào những gì bạn đang nói về cụ thể. Nếu bạn có ý định hoàn thành việc ký tên mù như mô tả trong các ý kiến ​​cho câu trả lời này, thì bạn sẽ cần sự hỗ trợ đặc biệt. Tôi sẽ nói nếu bạn không thể tìm thấy một cái gì đó xem xét và thử nghiệm, nó sẽ là một tập thể dục hay dự án mát mẻ để thực hiện của riêng bạn và đăng nó trên GitHub hoặc muốn.

+1

1) Chữ ký mù nào ngoài RSA bạn sẽ sử dụng? Tất cả các thuật toán chữ ký mù khác (ví dụ: Lucre) phức tạp và kỳ lạ hơn nhiều. 2) chữ ký RSA mù được bảo mật khi sử dụng đúng cách. Liên kết tấn công yêu cầu sử dụng không đúng. 3) Đối với các chữ ký RSA mù bạn cần một API đặc biệt, vì các API tiêu chuẩn áp dụng cả phần đệm và lũy thừa trong một bước, trong khi các chữ ký mù chúng cần được thực hiện riêng biệt.4) Phần còn lại của bài viết thậm chí còn ít ý nghĩa hơn, nhưng tôi không thực sự hiểu những gì bạn muốn nói ở đó. Thuật toán chữ ký thông thường rõ ràng là không bị mù. – CodesInChaos

+0

@CodesInChaos Không có hình thức thực sự chính xác cho chữ ký mù. Bất kỳ thuật toán có thể được sử dụng trong ký mù. Tất cả những gì bạn cần làm để thực hiện việc ký mù là chấp nhận tin nhắn, ký tên và xác minh các thư đã ký. Trong nhận xét của bạn, điểm # 2 không có thông tin, chỉ có tuyên bố của bạn. Điểm # 3 là ngớ ngẩn vì những gì tôi đã nêu ở đây. Đối với điểm số 1, quan trọng nhất, tôi sẽ sử dụng RSA truyền thống với đệm; thông điệp sẽ ở dạng đặc biệt và được mã hóa bằng khóa đối xứng độc lập để làm cho nó thực sự bị mù. Chữ ký mù là hữu ích để chứng minh một chuỗi các handoffs –

+0

Tôi hoàn toàn không nhận được làm thế nào bạn có thể sử dụng bất kỳ thuật toán cho chữ ký mù. Phần quan trọng của chữ ký mù là không thể liên kết chữ ký cuối cùng với yêu cầu chữ ký. Điều này có nghĩa là thông báo được thấy khi ký và thông báo được nhìn thấy khi xác minh không được có bất kỳ mối quan hệ rõ ràng nào trừ khi bạn biết giá trị làm mù bí mật. Chỉ cần ký một tin nhắn được mã hóa không có thuộc tính unlinkability đó. – CodesInChaos

1

Tôi có thể triển khai ứng dụng của mình bằng ngôn ngữ C++ hoặc .NET ... Thư hoặc phần mềm nào để ký và xác minh một cách mù quáng?

Dưới đây là câu trả lời dựa trên Crypto++. Crypto ++ là một thư viện lớp của các chương trình mã hóa được viết bởi Wei Dai. Ví dụ được lấy từ Raw RSA | Blind Signatures trên wiki.

Jack Lloyd's Botan, là thư viện mật mã C++ 11 và TLS, có thể có hỗ trợ chữ ký gốc.

Crypto ++ thiếu các lớp chữ ký mù. Phương pháp bên dưới tuân theo thuật toán cơ bản được nêu chi tiết tại Blind Signatures. Tuy nhiên, nó khác với Wikipedia bằng cách áp dụng kiểm tra chéo s(s'(x)) = x. Kiểm tra chéo hiện diện trong Chaum's original paper, nhưng nó bị thiếu trong bài viết wiki. Sự khác biệt thứ hai từ giấy và wikipedia của Chaum là mã bên dưới sử dụng H(m) thay vì m. Đó là do Rabin in 1979.

Bạn có thể muốn áp dụng hàm đệm trước tiên cho mỗi Usability of padding scheme in blinded RSA signature? hoặc RSA blind signatures in practice. Xem thêm 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; 
} 

Dưới đây là kết quả của việc xây dựng và chạy chương trình:

$ 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