2017-07-11 14 views
7

Tôi gặp sự cố khi hợp nhất thư viện PHP ionux/phactor và thư viện JS indutny/elliptic JS.Kết hợp các khóa sec256k1 trong JS và PHP

Một thư viện đang được sử dụng tại máy chủ LAMP, thư viện kia thông qua Nodejs tại Amazon Lambda.

Tôi tạo một cặp khóa bằng thư viện PHP; ký sha256 dữ liệu băm và lưu kết quả dưới dạng đầu ra JSON.

$ec = KeyManager::instance()->getECKeysByHash($k = '122e43fd75dd0492a259146ab5dfd5c6'); 

return $response = [ 
    'source' => [ 
     'message' => $m = 'asd', 
     'hash' => $h = hash('sha256', $m), 
     'hash_signed' => $ec->sign($h), 
    ], 
    'ec' => [ 
     'key' => $k, 
     'keys' => config(KeyManager::EC_DIR_NAME.'.'.$k) 
    ] 

]; 

Đầu ra:

{ 
    "source":{ 
     "message":"asd", 
     "hash":"688787d8ff144c502c7f5cffaafe2cc588d86079f9de88304c26b0cb99ce91c6", 
     "hash_signed":"30460221009a8c0c55ddc3ab3dc3b1e944a92c94fb215b7ed8ac332d398a6acb9d543a5d06022100e87f295c537fb2d14a52476e56b4c3a214be97e421510cbb46cb2059bed342bf" 
    }, 
    "ec":{ 
     "key":"122e43fd75dd0492a259146ab5dfd5c6", 
     "keys":{ 
     "private_key_hex":"0xde1a1c2734cc1e65b46946cfeb7cad28e48e8efbce5e36d859a4aa06ca9bb3f8", 
     "private_key_dec":"100459584715065215111848758376288522810407133161466091883119287856242863354872", 
     "public_key":"043876c88178bb7e386bbdb6325e201ec8e0e1ab75fc6c7713ed04051e029cb94b9d01c3b6aee0e6c5c92d7456f16667b08b4121526e97f5c704a19f7e9b3cd6c", 
     "public_key_compressed":"023876c88178bb7e386bbdb6325e201ec8e0e1ab75fc6c7713ed04051e029cb94b", 
     "public_key_x":"3876c88178bb7e386bbdb6325e201ec8e0e1ab75fc6c7713ed04051e029cb94b", 
     "public_key_y":"9d01c3b6aee0e6c5c92d7456f16667b08b4121526e97f5c704a19f7e9b3cd6c" 
     } 
    } 
}; 

Tôi đã lưu đầu ra cho một biến JS tests, và cố gắng để kiểm tra xem các hash được tạo ra ở phía bên PHP, tương đương với các thuật toán JS theo cách này:

var ecc = new EC('secp256k1'); 
var my_hash_word_array = CryptoJS.SHA256(tests.source.message); 
var my_hash = my_hash_word_array.toString(); 

console.log('hash equals:',tests.source.hash == my_hash); 

Tôi có thể làm như vậy trong trường hợp này bằng nhau!

Bây giờ, tôi muốn kiểm tra nếu tạo PHP phía chữ ký tests.source.hash_signed (từ tests.source.hash) liên quan đến các khóa công khai được biết đến sử dụng JS:

var key = ecc.keyFromPublic(tests.ec.keys.public_key_compressed, 'hex'); // <<< problem line 
console.log('signOk:', key.verify(my_hash, tests.source.hash_signed)); 

Kết quả là "signOk: false", tại sao? Tôi đang làm gì sai?

+0

mã php sử dụng giao diện trình bao bọc lớp của riêng tôi. Nhưng hoạt động chính xác bên trong thư viện php. Ngoài ra, trình bao bọc JS hoạt động ok bên trong mã js. Bất kỳ hành động nào có chia sẻ dữ liệu \ kiểm tra từ bên thứ ba -> php hoặc php-> bên thứ ba (nền tảng khác nhau) không hoạt động – LINKeRxUA

+0

js double bằng loại chuyển đổi.try để kiểm tra bằng "===" thay vì "==". Vì vậy, có thể bạn cần phải chuyển đổi các loại để kiểm tra xem chúng có bình đẳng không. –

Trả lời

1

Tôi đã dành khá nhiều thời gian cố gắng để theo dõi xuống này, và tôi khá chắc chắn vấn đề của bạn đã làm với bảng mã chủ chốt:

var key = ecc.keyFromPublic(tests.ec.keys.public_key_compressed, 'hex'); 

dòng này dường như đang tìm kiếm một chìa khóa mã hóa Hexadecimal .

Nhìn vào giá trị nạp của bạn:

"public_key_compressed":"023876c88178bb7e386bbdb6325e201ec8e0e1ab75fc6c7713ed04051e029cb94b", 

public_key_compressed không có trong mã hóa Hexadecimal (gợi ý: không bắt đầu bằng "0x")

Bạn nên chắc chắn để mã hóa giá trị này là Hexadecimal và thử lại.

+0

ok. Tôi sẽ cố gắng và đưa ra một phản hồi! Cám ơn phản hồi của bạn! – LINKeRxUA

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