2012-03-18 10 views
0

encrypted_strings RubyGemライブラリを使用してRuby Webアプリケーションで暗号化された暗号化されたメッセージを復号しようとしています。RubyのOpenSSLに相当するJava Crypto API(encrypted_stringsライブラリ経由)

は、暗号化クライアントコードは次のようになります。

cipher = EncryptedStrings::SymmetricCipher.new(:passphrase => "abcdefgh"*2) 
cipher.encrypt("howdy") 
=> "jEUQrH58Ulk=\n" 

対称暗号アルゴリズムはDES-EDE3-CBC(RubyGemのドキュメントは同意しないが、私は、コードが言うことで行くように見えるデフォルト)。だから、Java側に私はJavaの暗号化APIのDES-EDE3-CBCの利用の一例として、オンラインで見つける次のことを試してみました:

import javax.crypto.spec.DESedeKeySpec 
import javax.crypto.spec.IvParameterSpec 
import javax.crypto.Cipher 
import javax.crypto.SecretKeyFactory 


... 
DESedeKeySpec k; 
Cipher c; 

... 
k = new DESedeKeySpec("abcdefghabcdefgh".getBytes()); 
c = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
c.init(Cipher.DECRYPT_MODE, k); 
decrypted = c.doFinal("jEUQrH58Ulk=\n".getBytes()); 

私はJava側でこれを行うとき、私は、次のGET:

Wrong key size 

私も初期化ベクトルを使用してJava暗号化APIを使用してみましたが、私は、私はencrypted_stringsライブラリを経由してのRuby側でこれをやっておりませんので、バイトを設定しなければならないのか分からなかったし、設定されているように見えますOpenSSLとのCコードでの接続

いずれのポインタも大歓迎です。

私は弾力のある城JCAプロバイダを使用しています。私はまた、DES/ECB/PKCS5Padding(コードが前述のアルゴリズムDES-EDE3-CBCを参照しているように見えるにもかかわらず、RubyGemsドキュメンテーションの文書化されたデフォルトアルゴリズムに対応しています)を試しました。

私はJava暗号APIを読んでみましたが、ドキュメントにはすべて同じコードサンプルが含まれているように見えますが、新しい手がかりはあまりありません。私の情報源は、次のとおりです。

+1

例外とコードは入力しないでください。必ずコピー&ペーストしてください。あなたの例外はあなたのコードと一致しないので、あなたはここでそれらの1つを誤って入力しました。 'DESedeCipherKey()'のようなクラスはありません。 –

+0

Rubyの実装でOpenSSLを使用している場合は、ネイティブラッパーを使用して常に正確に一致させることができます。 http://www.warnertechnology.com/Computers/Software/JavaOpenSSL.shtmlこれは古代ですが、それはそれのアイデアを提供します。あなたが望むことをする商用ライブラリがたくさんありますが、無料のJava実装についてはわかりません。 –

+0

@DanielChapman図書館リンクのおかげで、私はJava Cryptography APIを理解できない場合、その道を調査します。 – user972294

答えて

0

私は答えとして、それを投稿します。 DESedeでは、192ビットのDES ABCキーまたは128ビットのABAキーを使用できます。 Javaの多くのバージョンでは、192ビット(24バイト)のDES ABCキーしか受け入れられません。 DES ABAキーは、暗号化、復号化、暗号化(EDE)操作の最初と最後のキーが同じ場所です。言い換えれば、ABCでのDESedeと同じです(C = A)。

このようなキーを作成するには、最初の8バイト(あなたのケースでは8文字のASCII文字 - キーが間違っているため文字を直接使用する)を最後にコピーして連結することができます。これは"abcdefghabcdefghabcdefgh".getBytes("ASCII")になります。プラットフォームでは、デフォルトの文字エンコーディングとしてUTF-16を使用する可能性があるため、常に文字エンコーディングを指定する必要があることに注意してください。その結果、サイズが2倍になります。

関連する問題