2

Rubyで復号化しようとしているColdFusionで暗号化されたデータがあります。ただし、出力を一致させることはできません。

ColdFusion 側では、次のようなものがあります。

<cfset key = 'DiYVka4mAYk=' /> 
<cfset str = 'hello' />

<cfset enc = encrypt(str, key, 'des', "base64") />
<cfset dec = decrypt(enc, key, 'des', "base64") />

<cfoutput>
#str#   <!--- 'hello' --->
<br />
#enc#   <!--- '3rNKAnEu+VA=' --->
<br />
#dec#   <!--- 'hello' --->
</cfoutput>

同じ、Ruby で実装:

require 'openssl'
require 'base64'

str = 'hello'
key = 'DiYVka4mAYk='

des = OpenSSL::Cipher.new('des')

des.encrypt 
des.key = key
data = des.update(str) + des.final  
enc = Base64.encode64(data)

des.decrypt
des.key = key
dec = des.update(Base64.decode64(enc)) + des.final  

puts str  # => 'hello'
puts enc  # => 'wVQs6NjOZwM='
puts dec  # => 'hello'

どちらも機能しますが、暗号化された文字列は異なります。そのため、ColdFusion と Ruby の間で暗号化されたデータを渡すことはできません。

キーは、ColdFusion のgenerateSecretKey()関数を使用して生成されました。Base64 でエンコードされているように見えるので、Ruby で次のようにキーを設定してみました。

key = Base64.decode64('DiYVka4mAYk=')

繰り返しますが、コードは機能しますが、暗号化された文字列が異なります。

キーエンコーディングに関して欠けているものはありますか?

また、 ColdFusion でアルゴリズムを「des」に設定すると、より多くの情報が暗示されるのではないかと考えました。そこで、次のようにルビーで暗号を作成してみました。

  • des-cbc
  • des-cfb
  • des-ecb
  • デスエデ
  • des-ede-cbc
  • des-ede-cfb
  • des-ede-ofb
  • des-ofb

繰り返しますが、暗号化された文字列にはいくつかのバリエーションがあります。しかし、元の ColdFusion バージョンと一致するものはありません。

注: ColdFusion 暗号化は長い間使用されてきたので、その部分を編集することはできません。「修正」は Ruby にある必要があります。

4

1 に答える 1

4

尋ねられたので、コメントを回答に転送します。

暗号モード、IV、およびパディングが両端から一致していることを確認する必要があります。

1.8.7 と 1.9.3 の Ruby のデフォルトは、ECB で IV なし、PCKS パディングです。ColdFusion のデフォルトは同じです。

ただし、ruby 1.9.2 または特定の環境では、デフォルトの暗号モードが ECB ではなく、出力が変化しているようです。コメントしたように、暗号モードを ECB に手動で設定すると (OpenSSL::Cipher.new("DES-ECB"))、問題が修正されます。

于 2012-10-18T03:05:04.833 に答える