2011-12-27 27 views
5

Tôi đang cố gắng để giải mã các base64 mã hóa ciphertext sau trong Node.js với built-in thư viện cryptoGiải mã blowfish-ECB với crypto nodejs vs Mcrypt php của

2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A== 

Có vẻ như để làm việc với Mcrypt PHP các hàm sử dụng chuỗi typeconfig.sys^_- làm khóa, như được hiển thị bằng cách nhập giá trị vào http://www.tools4noobs.com/online_tools/decrypt/ và chọn Giải mã Blowfish, ECB, Base64.

Tuy nhiên, khi tôi chạy đoạn mã sau vào Node.js:

var crypto = require('crypto'); 
var data = "2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A=="; 
var decipher = crypto.createDecipher('bf-ecb', 'typeconfig.sys^_-'); 
data = decipher.update(data, "base64", "utf8"); 
data += decipher.final("utf8"); 
console.log(data); 

tôi nhận ra rác:

y 
�:����d�(����Q�i��z1��4�� �k�(� ��a5����u��73c/��(ֻ��)��������fȠ��� 
                   �ec�-<z�8����(�-L���ԛ�I��1L*��u�4�j-�Чh쭊@\P)?޼�.�^���q㊬�U���W&�x��85�T-ג9,dE<g}�`*� 
��|@����k"�!�D'u���,x��7���� 
       ��9q=q�q��ա>�w�T����H3͜�i)R��zy��C�� 
                ��o� 

Tôi cũng đã thử một bài kiểm tra của thư viện riêng của mình, trong đó có vẻ như có thể xử lý nội dung nó mã hóa chính nó:

var crypto = require('crypto') 
var cipher = crypto.createCipher("bf-ecb", "key"); 
var data = cipher.update("foobar", "utf8", "base64"); 
data += cipher.final("base64"); 
console.log(data); 
var decipher = crypto.createDecipher("bf-ecb", "key"); 
data = decipher.update(data, "base64", "utf8"); 
data += decipher.final("utf8"); 
console.log(data); 

sản xuất:

y0rq5pYkiU0= 
foobar 

nhưng sao chép và dán chuỗi base64 đó và nhập nó vào http://www.tools4noobs.com/online_tools/decrypt/ cùng với khóa "chính" cũng tạo ra sản lượng rác.

Hai thư viện này không tạo ra cùng một đầu ra hay có điều gì đó tôi đã làm sai?

+0

Các tài liệu cho Node.js và PHP Mcrypt không rõ ràng, nhưng có vẻ như Node.js sử dụng một chức năng nguồn gốc quan trọng, trong khi Mcrypt sử dụng phím như nó vốn có. Vì Node.js triển khai PBKDF2, tôi đoán đó là thuật toán dẫn xuất khóa của nó, nhưng tôi không thấy cách xác định các tham số. Bạn nên tìm ra các tham số mà nó sử dụng, sau đó lấy được một khóa cho mật khẩu của bạn và sử dụng khóa đó ở phía PHP. – erickson

+0

Ồ, ngoài ra, tôi nhận thấy trong mã Node.js đang hoạt động, bạn sử dụng 'createCipher()' để mã hóa * và * giải mã, trong khi trong mã ban đầu, không làm việc của bạn, bạn đang sử dụng 'createDecipher()'. – erickson

+0

@erickson yes, 'createCipher' hai lần là lỗi đánh máy, xin lỗi .. Vấn đề của tôi là tôi đang cố gắng tương thích với dịch vụ khác yêu cầu mã thô cụ thể đó (xem chuỗi mã hóa base64 đầu tiên cho ví dụ), vì vậy câu trả lời của bạn giúp giải thích sự khác biệt giữa hai, nó không thực sự giúp tôi giải mã và mã hóa những gì tôi cần. –

Trả lời

5

Node.js tính giá trị băm MD5 của mật khẩu trước khi sử dụng nó làm khóa. Theo như tôi có thể nói, mcrypt sử dụng khóa như-là.

Tính giá trị băm MD5 của mật khẩu và sử dụng mật khẩu đó làm khóa mcrypt.

+4

Có vẻ như đó là đủ lực đẩy đúng hướng. 'createCipher' và' createDecipher' sử dụng băm MD5 của khóa, trong khi 'createCipheriv' và' createDecipheriv' sử dụng khóa thô và IV được cung cấp. Thay đổi mã để sử dụng 'crypto.createDecipheriv ('bf-ecb', 'typeconfig.sys^_-', '')' làm cho nó hoạt động ngay bây giờ. Cảm ơn! –

+0

@erickson Bất kỳ ý tưởng nào về câu hỏi này? http://stackoverflow.com/questions/37825261/php-warning-mcrypt-generic-init-iv-size-is-incorrect-supplied-length-12-n –

2

https://github.com/tugrul/node-mcrypt

var mcrypt = require('mcrypt'); 

var bfEcb = new mcrypt.MCrypt('blowfish', 'ecb'); 

bfEcb.open('typeconfig.sys^_-'); 

var cipherText = new Buffer('2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==', 'base64'); 

console.log(bfEcb.decrypt(cipherText).toString()); 

bfEcb.close();