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, sum
và psum
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()
và _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.
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? –
Bạn đang cố gắng làm điều đó trong trình duyệt hoặc với nút? – Breedly
Cố gắng thực hiện nó trong nút. –