2014-10-15 14 views
5

Tôi cần phải trao đổi với một API PHP làm phiền các yêu cầu và câu trả lời. Về phía tôi, tôi đang ở trong đường ray 4.0.0 (ruby 2.0) và tôi không thể làm cho nó hoạt động được.Làm cách nào để tôi có thể mã hóa 128 CFB thành Ruby?

Tôi đã đọc rất nhiều câu trả lời về chủ đề này và đã cố gắng hiểu cách thức hoạt động của mcrypt, ví dụ: http://www.chilkatsoft.com/p/php_aes.asp, nhưng không thành công. Tôi vẫn không thể giải mã mã được mã hóa từ PHP hoặc mã hóa thứ gì đó mà PHP có thể giải mã

Bạn có thể giúp tôi và xem tôi đang làm gì sai không?

mã PHP: Mã

$secretKey = "1234567891234567"; 
$encrypt = urlencode(base64_encode(mcrypt_encrypt(
      MCRYPT_RIJNDAEL_128, 
      md5($secretKey), 
      $cleartext, 
      MCRYPT_MODE_CFB, 
      $secretKey 
      ))); 

$input = urldecode($input); 
$decrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, 
          md5($secretKey), 
          base64_decode($input), 
          MCRYPT_MODE_CFB, 
          $secretKey); 

Ruby:

def self.encode(params = {}) 
    cipher = OpenSSL::Cipher::AES.new(256, :CFB) 
    cipher.encrypt 
    cipher.key = Digest::MD5.hexdigest("1234567891234567") 
    cipher.iv = "1234567891234567" 
    encrypted = cipher.update(params.to_query) + cipher.final 

    CGI.escape(Base64.strict_encode64(encrypted)) 
end 

def self.decode(answer) 
    decrypted = Base64.decode64(CGI.unescape(answer)) 

    decipher = OpenSSL::Cipher::AES.new(256, :CFB) 
    decipher.decrypt 
    decipher.key = Digest::MD5.hexdigest("1234567891234567") 
    decipher.iv = "1234567891234567" 
    decoded = decipher.update(decrypted) + decipher.final 
end 
+0

Bạn đã so sánh đầu ra của các hàm MD5, đặc biệt nếu chúng là chữ hoa hoặc chữ thường (PS nếu điều này giải quyết vấn đề tôi muốn đăng câu trả lời này) –

+0

Đó là lần kiểm tra đầu tiên của tôi, md5, Base64.encode64 và urlencode. Nhưng đối với hồ sơ: md5 php: fb77fc7f384d0c2bc555701e57a9e589 md5 ruby: fb77fc7f384d0c2bc555701e57a9e589 – Stephanie

+0

Vâng, điều đó khiến tôi bối rối. Tôi đoán rằng tôi chỉ có thể gỡ lỗi câu trả lời, nhưng điều đó có nghĩa là đảm bảo trình thông dịch PHP và Ruby của tôi đang hoạt động và đang chạy ... đã được bỏ phiếu. –

Trả lời

5

Bạn phải sử dụng 'ncfb' thay vì MCRYPT_MODE_CFB trong mã PHP. PHP mặc định là nguồn cấp dữ liệu 8 bit trở lại thay vì nguồn cấp dữ liệu trở lại kích thước khối đầy đủ.

Hoặc bạn có thể chỉ định :CFB8 để tương thích với PHP trong Ruby. Điều này tôi đoán sau khi đọc tài liệu cho CFB trong tài liệu OpenSSL.

Rất cám ơn this Q/A on IT security mà tôi chỉ tìm thấy vì tôi biết những gì tôi đang tìm kiếm.

+0

'ncfb' - tức là phản hồi 128 bit nên được ưu tiên. –

+0

Cảm ơn bạn rất nhiều !!! Tôi đặt: CFB8 trong mã ruby ​​của tôi và nó hoạt động hoàn toàn như tôi không phải là chủ sở hữu của mã PHP. Cảm ơn bạn đã giúp đỡ về điều này! – Stephanie

+1

@Stephanie Vui mừng vì nó đã làm việc cho bạn Stephanie. Vâng, đó là lý do tại sao tôi chỉnh sửa câu trả lời của tôi, nó xảy ra khá thường xuyên mà một bên về cơ bản được xác định trước và không thể thay đổi. –

1

hãy nhìn vào https://github.com/kingpong/ruby-mcrypt

trong tập tin đá quý của bạn thêm

gem "ruby-mcrypt", :lib => "mcrypt"

Cách sử dụng

crypto = Mcrypt.new(:twofish, :cbc, MY_KEY, MY_IV, :pkcs) 

# encryption and decryption in one step 
ciphertext = crypto.encrypt(plaintext) 
plaintext = crypto.decrypt(ciphertext) 

# encrypt in smaller steps 
while chunk = $stdin.read(4096) 
    $stdout << crypto.encrypt_more(chunk) 
end 
$stdout << crypto.encrypt_finish 

# or decrypt: 
while chunk = $stdin.read(4096) 
    $stdout << crypto.decrypt_more(chunk) 
end 
$stdout << crypto.decrypt_finish 

bạn cũng có thể kiểm tra https://stackoverflow.com/a/21489711/1380867

+0

Ồ, chờ đã, bây giờ tôi thấy những gì bạn đang hiển thị. Sử dụng 'mcrypt' cho Ruby là tốt (OpenSSL được duy trì tốt hơn, nhưng tôi đoán nếu bạn sử dụng' mcrypt' trong PHP ...). Nhưng hiện tại bạn không phù hợp với mật mã trong câu hỏi nếu bạn chỉ định vùng đệm hai chiều, CBC và PKCS. –

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