1

AESで暗号化されたバイト配列があります。この配列をJavaアプリケーションで復号化すると、すべて問題ありません。しかし、サーブレットコンテナでは、復号化が間違っています。

これが私のバイト配列です

       String [] str = new String[] {"41", "23", "67" ,"-124", "-56" ,"-35" ,"89", "-54" ,"-17" ,"-49" ,"-53", "-21" ,"125" ,"4", "98", "-13", "60" ,"-72", "12", "75" ,"-105" ,"-104", "107", "34", "1", "-109", "-19", "-102", "-72", "9" ,"26" ,"-39", "-60", "-15", "0" ,"112", "-5", "-86", "-7", "5" ,"75", "100" ,"94", "-47", "6", "-81", "-22", "82", "97" ,"114", "3", "-24", "-80", "67", "106", "-100" ,"-35", "-83", "54", "-95", "124", "-22", "-100", "-47" };

        byte [] inv = new byte[str.length];

        int count = 0;
        for (String s : str) {
            inv[count++] = Byte.valueOf(s);
        }

Javaアプリケーションの結果

Decrypted: 000000.016*kWh|000000.007*kWh|000000.015*kWh|000000.000*kWh

私のアプリケーションコード

 byte[] keyBytes = "vikoAmrPass12345".getBytes(); 
 SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 
 Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); 
 cipher.init(Cipher.DECRYPT_MODE, key); 
 byte [] out = cipher.doFinal(inv); 
 System.out.println("Decrypted: " +new String(out));

サーブレットコンテナで動作する私のWebコードは、上記のものと完全に同じです。しかし、コンテナの暗号化された結果は

'?f ??0??????b]5hJ?F*`U????.8??p@?]?u?~Nb??z?????{3??;?

ここで何が問題になっていますか?

私のアプリケーションでは、暗号化されたバイト配列を次のように取得しました

ServerSocket ss = new ServetSocket(port); 
Socket socket = ss.accept(); 
InputStream in = socket.getInputStream(); 
byte [] sizeBuffer = new byte[5]; 
in.read(sizeBuffer); 
byte [] dataBuffer = new byte[Integer.valueOf(""+new String(sizeBuffer)];     
in.read(dataBuffer);

暗号化されたデータはdataBuffer配列に存在します。また、暗号化は組み込みデバイスで処理されます。

私の構成

java 1.6 tomcat 7.1

ありがとう。

4

1 に答える 1

2

あなたが投稿したコードから:

byte[] keyBytes = "vikoAmrPass12345".getBytes();

それ問題になる可能性があります。複数の場所で同じ結果が得られると予想される場合は、プラットフォームのデフォルトエンコーディングを使用しないでください。常にエンコーディングを指定してください。

これを行った場合、暗号化されたデータの転送方法に問題がある可能性もあります。それから文字列を作成する場合は、ほぼ確実にBase64を使用する必要があります(たとえば、このライブラリを使用する場合) 。使用している場合:

// Bad! Do not use!
String encryptedText = new String(encryptedData);

そうすると、基本的に情報が失われ、問題の原因になる可能性があります。

編集:さて、これであなたの受信コードは次のようになりました:

ServerSocket ss = new ServetSocket(port);
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
byte [] sizeBuffer = new byte[5];
in.read(sizeBuffer);
byte [] dataBuffer = new byte[Integer.valueOf(""+new String(sizeBuffer)]; 
in.read(dataBuffer);

ここでは、少なくとも3つの問題があります。

  • コードは99999バイトを超えることはできない可能性があり、10000バイト未満をどのように処理するかは明確ではありません。
  • デフォルトの文字エンコードはプラットフォーム間で一貫していると想定しています
  • コードは、呼び出すたびに、正確な量の情報が読み取られることを前提としています。read特にネットワークストリームの場合は、そうならない可能性が高くなります。の戻り値を使用して、実際に読み取られたread量を確認する必要があります。必要なすべてのデータを読み取る(またはストリーム内のデータがなくなる)までループするか、同じことを行うために高レベルのAPIを使用する必要があります。
于 2012-08-12T19:25:31.630 に答える