0

APIプロバイダーからいくつかのテストデータキー/テキスト/暗号化を取得し、以下の関数で同じ暗号化結果を生成しようとしていますが、結果は241桁の最後の16桁で提供されたものとは異なります。あなたは考えを持っていますか、その理由は何でしょうか?'bf-ecb'が正しいモードであることを確認し、urlエンコードを試しましたが、これまでのところ成功していません。

require 'openssl'

def encrypt(key, data)
    cipher = OpenSSL::Cipher::Cipher.new('bf-ecb').send(:encrypt)
    cipher.key = key
    result = cipher.update(data) << cipher.final

    hexed = ''
    result.each_byte { |c| hexed << '%02x' % c }
    hexed.upcase
end

アップデート

また、サンプル結果を復号化しようとすると、OpenSSL :: Cipher::CipherError「不正な復号化」が発生します

4

3 に答える 3

3

最後の 16 桁 (=128 ビット) が正しくない場合、最後のブロックに問題がある可能性があります。おそらくこれはパディングの問題です。暗号化では 1 つの形式のパディングが使用されていますが、復号化では別のパディングが想定されています。両側のパディングを明示的に指定することをお勧めします。PKCS5 または PKCS7 が通常の選択です。不完全なパディングは、「不正な復号化」エラー メッセージについても説明します。

于 2011-08-25T11:46:22.253 に答える
1

それは確かにパディングに問題がありました。非アクティブ化して自分で実装することで回避しました。これまでのところ、動作します。

これは次のようになります。

require 'openssl'

def encrypt(key,data)
  cipher = OpenSSL::Cipher::Cipher.new "bf-ecb"
  cipher.padding = 0
  cipher.key = key
  cipher.encrypt
  enhex(cipher.update padd data)
end
def decrypt(key,data,len)
  cipher = OpenSSL::Cipher::Cipher.new "bf-ecb"
  cipher.padding = 0
  cipher.key = key
  cipher.decrypt
  (cipher.update dehex(data)).slice(0,len)
end
def enhex(data)
  hexed = ''
  data.each_byte { |c| hexed << '%02x' % c }
  hexed.upcase
end
def dehex(data)
  data.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
end 
def padd(data)
  data + " "*(8 - (data.length % 8))
end
于 2011-08-31T13:58:46.960 に答える
0

次のように、ecb 暗号モードでフグ暗号化を簡単に実行できます。

def blowfish_encrypt(key,data)
  cipher = OpenSSL::Cipher::Cipher.new("bf-ecb").send :encrypt
  cipher.key = key
  cipher.update(data) << cipher.final
end

この場合、パディングを気にする必要はありません。

于 2011-09-23T15:02:57.880 に答える