3

最近、Flex/Java ソフトウェア ソリューションを Windows から Linux (CentOS6 64 ビット) に移行しようとしたところ、この問題に遭遇しました。

簡単に言うと、Flex/ActionScript (com.hurlant ライブラリを使用) で短いテキストを暗号化しています。アルゴリズムは、ECB と PKCS5Padding を使用した TripleDES です。サーバーは JBoss 5.1.0GA です。

この暗号化されたテキストは、JMS 宛先に送信されます。

JMS の受信側には、(BouncyCastle を使用して) テキストの暗号化を解除しようとする単純な Java アプリケーションがあります。

これはすべて、Windows で魅力的に機能します。Linux では、次のようになります。

javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(DashoA13*..)

Java アプリ (Base64 でエンコード) によって受信されたときに暗号化されたテキストをログに記録しましたが、Linux と Windows の両方で同じです。キーは明らかに同じです。

文字セットエンコーディングの問題である可能性があると信じていましたが、-Dfile.encoding=UTF8 または -Dfile.encoding=windows-1252 オプションを使用して JBoss と Java アプリの両方を起動しても機能しませんでした。

暗号化に使用されるコード (ActionScript) は次のとおりです。

var keyData:ByteArray = Hex.toArray(Hex.fromString("jgd8f3m8ybjhwlGhr4hihbp0"));
var pinData:ByteArray = Hex.toArray(Hex.fromString("12341234"));
var pad:IPad = new PKCS5;
var mode:ICipher = Crypto.getCipher("simple-3des-ecb", keyData, pad);
pad.setBlockSize(mode.getBlockSize());               
mode.encrypt(pinData);
var message:IMessage = new AsyncMessage();
message.body = Base64.encodeByteArray(pinData);

復号化に使用されるコードは次のとおりです (Java)。

String userPin3DESEncrypted = new String(Base64.decodeBase64(userPin3DESBase64Encrypted.getBytes()));
byte [] keyByte = "jgd8f3m8ybjhwlGhr4hihbp0".getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(keyByte, "DESEDE");
Cipher cipher = Cipher.getInstance("DESEDE/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
String userPinDecrypted = new String(cipher.doFinal(userPin3DESEncrypted.getBytes()));

前述のように、の内容はuserPin3DESBase64EncryptedLinux と Windows の両方で同じ (同じ Base64 文字列) であるため、問題は Flex/JBoss 側にあるはずはありません...

何か案は?

私が何度もやったように、机に頭をぶつけようとしているすべての人に前もって感謝します...

乾杯

ルカ

4

2 に答える 2

1

Base64 でデコードされた暗号化 (つまりバイナリ) データから String を作成することは、間違った考えです。代わりに、すべてのバイナリ データに byte[] を使用してください。

于 2013-04-11T10:22:53.497 に答える
1

完全に機能する Java コードは次のとおりです。

byte[] userPin3DESEncrypted = Base64.decodeBase64(userPin3DESBase64Encrypted.getBytes());
byte [] keyByte = "jgd8f3m8ybjhwlGhr4hihbp0".getBytes();
SecretKeySpec secretKeySpec = new SecretKeySpec(keyByte, "DESEDE");
Cipher cipher = Cipher.getInstance("DESEDE/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
String userPinDecrypted = new String(cipher.doFinal(userPin3DESEncrypted));
于 2013-04-11T10:42:07.950 に答える