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 にある必要があります。