3

既存のコードを Python から Ruby に書き直していますが、理解できない奇妙なエラーに遭遇しました。ここに Python コードがあります (動作します):

import sha, hmac
data = 'sampledata'
data = data.encode('ascii')
des_key = hmac.new(data + "\0", "SUPERSECRET", sha).digest()[0:8]

出力: 0x64F461D377D9930C

そしてRuby(私は初めてです)コード:

require 'openssl'
digest  = OpenSSL::Digest::SHA.new
data = 'sampledata'
data.encode!('ascii')
puts OpenSSL::HMAC.hexdigest(digest, "SUPERSECRET", data + "\0")[0, 16]

出力: 0x563FDAF11E63277C

この違いの原因は何ですか?

4

2 に答える 2

5

あなたは2つの間違いを犯しました:

  1. Pythonのhmac.newはキー、メソッド、ダイジェストを受け取るので、次のように書く必要があります

    hmac.new( "SUPERSECRET"、data + "\ 0"、sha)

  2. RubyでのOpenSSL::DigestのデフォルトのダイジェストメソッドはSHA1ではありません(それが何であるかはわかりません)。あなたはただ使うべきです:

    OpenSSL :: HMAC.hexdigest('sha1'、 "SUPERSECRET"、data + "\ 0")[0,16]

両方のメソッド(最初はPython、2番目はRuby)は同じ出力を返します。

于 2012-07-22T09:23:58.870 に答える
4

Guy Adini の答えに加えて、Ruby SHA は(in : )である pythonshaとは異なります。sha1sha.pyfrom hashlib import sha1 as sha

from hashlib import *
import hmac
data = 'sampledata'
data = data.encode('ascii')

algo = [sha1, sha224, sha256, sha512]
for al in algo:
    print al().name, hmac.new("SUPERSECRET", data + "\0", al).hexdigest()[0:16]

生成:

sha1 50c61ea49195f03c
sha224 fd6a418ee0ae21c8
sha256 79deab13bd7b041a
sha512 31561f9c9df69ab2

そしてRubyでは:

require 'openssl'
data = 'sampledata'
data.encode!('ascii')
%w(sha sha1 sha224 sha256 sha512).each do |al|
  puts "#{al}: #{OpenSSL::HMAC::hexdigest(al, "SUPERSECRET", "#{data}\0")[0,16]}"
end

生成:

sha: 563fdaf11e63277c
sha1: 50c61ea49195f03c
sha224: fd6a418ee0ae21c8
sha256: 79deab13bd7b041a
sha512: 31561f9c9df69ab2
于 2012-07-22T09:38:04.250 に答える