私は暗号化されたデータを交換するWebサービスと対話しているRubyプロジェクトに取り組んでいます。Rubyの.NETで3DESを使用して16進文字列を復号化する
私はRubyのWebサービスから戻ってくるものを解読するのに非常に苦労していますが、.NET側ではうまくいきますが、他の多くのWebベースまたはデスクトップベースのツールでこれを処理できます。
暗号化方式は、ECBとパディングなしの3DESでした。
以下は、私が取り組んでいるテストスクリプトです。私はこれらの文字列を正しく解凍するために考えられるすべてを試しましたが、役に立たないものです。
require 'openssl'
require 'base64'
def cipher(key, encrypted)
key = key.unpack('a2'*32).map{|x| x.hex}.pack('c'*32)
encrypted = encrypted.unpack('a2'*32).map{|x| x.hex}.pack('c'*32)
OpenSSL::Cipher::ciphers.select{|c| c.include? 'des3' }.map do |cipher_name|
begin
cipher = OpenSSL::Cipher.new(cipher_name)
cipher.padding = 0
cipher.decrypt
cipher.key=key
plain = cipher.update(encrypted) + cipher.final
p "Cipher #{cipher_name} success: #{plain} #{plain.class} #{plain.length} #{plain.encoding.to_s}"
plain
rescue => e
p "Cipher #{cipher_name} failed #{e}"
nil
end
end
end
key = '202FA9B21843D7022B6466DB68327E1F'
encrypted = 'ff6f07e270ebd5c0878c67c999d87ebf'
res1 = cipher key, encrypted
key = '49CE85147B24123718AB3F4539AB1A21'
encrypted = '995604ed8016da8897f1875ebd725529'
res2 = cipher key, encrypted
p res1 == res2 ? "SUCCESS" : "FAIL"
# In both cases, the correct output should be '25588015543912470222703296730936'
「3DとECBとパディングなし」、うわー、なんと悪い組み合わせ!レガシーシステムとの互換性のために使用する必要があり、レガシーシステムを変更することができない限り、3DESを使用しないでください。 ECBモードを使用しないでください。安全ではありません。[ECBモード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)を参照して、ペンギンまでスクロールしてください。無作為のIVでCBCを使用し、IVを暗号化されたデータの前に追加します。 入力データが常にブロックサイズの倍数でない場合は、入力データにパディングを追加する必要があります。パディングを指定する場合は、PKCS#5がDES/3DESの優先パディングです。 – zaph
コメントありがとうございます。私は同意し、それが避けられればそれをしないだろう。 – alkaloids
ああ、実際のセキュリティはそれほど重要ではない、いつも前例を取る言い訳があるようだ。 – zaph