2015-07-04 14 views
11

Tôi muốn thực hiện một cái gì đó giống như two-man rule sử dụng elip đường cong mật mã trong javascript.Elliptic ngưỡng đường cong mật mã trong nút

Chỉnh sửa: Tôi thực chất đang tìm kiếm thứ gì đó như Bitcoin multisig.

Vì vậy, tôi cần phải kết hợp hai khóa công khai để nhận khóa kết hợp yêu cầu cả hai khóa riêng tư để tạo chữ ký. Xem https://crypto.stackexchange.com/questions/25250/adding-two-public-keys.

Làm cách nào tôi có thể thực hiện việc này trong nút?

+2

Một cái gì đó như thế này: https://github.com/wanderer/secp256k1-node nhưng hoàn toàn trong JS mà không có C? –

+0

Bạn đang cố gắng làm điều đó trong trình duyệt hoặc với nút? – Breedly

+0

Cố gắng thực hiện nó trong nút. –

Trả lời

7

Vì hệ thống mật mã ngưỡng đường cong elliptic có thuộc tính thêm khóa, tại sao không chỉ làm vậy?

Tôi đã cố gắng này bằng cách sử dụng elliptic module cho Node.js, chỉ cần cài đặt nó với NPM và sau đó hãy thử như sau

var EC = require('elliptic').ec; 
// we use the same preset of bitcoin, but should work with the other ones too 
var ec = new EC('secp256k1'); 

// generate two (or more) starting keypairs 
var key1 = ec.genKeyPair(); 
var key2 = ec.genKeyPair(); 

// sum the public... 
var sum = key1.getPublic().add(key2.getPublic()); 
// ...and private keys 
var psum = key1.getPrivate().add(key2.getPrivate()); 

Từ khóa công khai là Point đối tượng và các phím riêng là BigNumber đối tượng, bạn có thể chỉ gọi hàm add() trên cả hai. Tại thời điểm này, sumpsum giữ phím kết hợp của bạn, nhưng khi sử dụng chúng để ký một thông điệp mà bạn sẽ cần phải tạo ra một KeyPair đối tượng (một phần của mô-đun elip).

// generate two new random keypairs 
var privateKeySum = ec.genKeyPair(); 
var publicKeySum = ec.genKeyPair(); 

// we don't care about their values 
// so just import the sum of keys into them 
privateKeySum._importPrivate(psum); 
publicKeySum._importPublic(sum); 

Như bạn thấy, để tạo ra một cặp khóa mới tôi chỉ làm cho những người mới ngẫu nhiên và sau đó sử dụng các chức năng _importPrivate()_importPublic() để tải các phím kết hợp.

Đó là một chút hacky, tôi biết, nhưng nó hoạt động.

Một giải pháp tốt hơn là chỉ cần xuất đối tượng KeyPair từ mô-đun và tạo đối tượng mới với hàm tạo của chúng.

Sau đó, chỉ cần tiến hành như bình thường, giống như trong mẫu được cung cấp bởi readme của mô-đun:

var msg = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
// Sign the message with our new combined private key 
var signature = privateKeySum.sign(msg); 

// Export DER encoded signature in Array 
var derSign = signature.toDER(); 

// Verify signature using the combined public key, should return true 
console.log(publicKeySum.verify(msg, derSign)); 

Sử dụng này, sau khi thế hệ đầu tiên, bạn có thể yêu cầu hai (hoặc nhiều hơn) khóa công khai yêu cầu để xác minh chữ ký thư. Nếu bạn coi các khóa công khai là 'mật khẩu', sau đó bạn có thể kiểm tra chữ ký chống lại bất kỳ thư nào để xác minh rằng hai khóa công khai là các khóa gốc.

Ngoài ra, điều này sẽ hoạt động với nhiều khóa, nhưng nó sẽ luôn yêu cầu tất cả trong số chúng để thành công.

Các vấn đề liên quan