2009-08-25 24 views
2

データベースから暗号化された値を読み取る必要があるjavaで書かれた新しいアプリケーションがあります。問題は、dbのすべての値が、ANSI x923パディングスキームを使用する.NETコードによって暗号化されていることです。私はいくつかの調査を行いましたが、Java TripleDesライブラリにこのパディングスキームを指定する方法がないように見えます。 ANSI x923がjavaでサポートされていないか、またはこれを動作させる方法があるかどうか誰にでも分かりますか?Java ANSI X923パディング

答えて

2

Bouncy Castle JCEを使用する場合、X923パディングがサポートされています。私は、SunのJCEがそれをサポートしているとは思わない、(あなたはCBCモードを使用すると仮定して)このよう

cipher = Cipher.getInstance("DESede/CBC/X9.23PADDING"); 

を暗号を得ることができます。しかし、パディングなしで単純に解読し、パディングを自分で削除することができます。 X9.23では、最後のバイトは追加されたパディングの数です。だからこのようなことをすることができます。

cipher = Cipher.getInstance("DESede/CBC/NOPADDING"); 
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
int outSize = cipher.getOutputSize(cipherText.length); 
plainText = new byte[outSize]; 
length = cipher.update(cipherText, plainText, 0); 
cipher.doFinal(plainText, length); 

//Remove padding 
int newLen = plainText.length - (plainText[plainText.length-1] & 0xFF); 
byte[] data = new byte[newLen]; 
System.arraycopy(plainText, 0, data, 0, newLen); 
+0

私は簡単にBouncy Castle APIを見て、JCEプロバイダがそれをサポートしているかどうかを確認しましたが、私は十分に見苦しくはありませんでした。 – laz

0

SunのドキュメントJCA Standard Algorithm Namesにある「暗号アルゴリズムパディング」のセクションにはパディングスキームは含まれていないため、サポートされていないようです。つまり、Bouncy Castleは、X9.23パディングのan implementationを提供しています。これは、外部ライブラリとJCAの範囲外のベンチャーを使用できる場合に直接使用できます。