2011-11-11 5 views
0

私は、ソフトウェアの2つの別々の部分を使用して、ネットワーク接続の両端で情報を暗号化および復号化伴い、いくつかのJavaソフトウェアに取り組んでいます。これを簡単にするために、データの暗号化を処理する1つのクラスの暗号化ツールがあります。今のように、コントローラ(接続の一方の側)とエージェント(反対側)は、二つのプログラム間で共有されるパスワードに基づいのSecretKeyを生成するために、このクラスを使用して、両方。同じパスワードベースの暗号化キーを生成できないのはなぜですか?

public SecretKey generateKey(String key) { 
    this._paramSpec = new PBEParameterSpec(this.SALT, this.ITERATION_COUNT); 
    PBEKeySpec spec = new PBEKeySpec(key.toCharArray()); 
    SecretKeyFactory fac = null; 
    try { 
     fac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
    } catch (NoSuchAlgorithmException ex) { 
     ex.printStackTrace(); 
     System.err.println("[ERR] Cryptographer could not create a SecretKeyFactory due to an unsupported algorithm."); 
    } 
    try { 
     if (fac == null) 
      return null; 
     return fac.generateSecret(spec); 
    } catch (InvalidKeySpecException ex) { 
     System.err.println("[ERR] Cryptographer could not generate a SecretKey due to an invalid Key Specification."); 
     ex.printStackTrace(); 
     return null; 
    } 
} 

暗号化自体が暗号化機能で行われます:

public byte[] encrypt(byte[] message) { 
    try { 
     this._cipher.init(Cipher.ENCRYPT_MODE, this._key, this._paramSpec); 
    } catch (InvalidKeyException ex) { 
     System.err.println("[ERR] Cryptographer could not encrypt a message because the provided key is invalid."); 
     ex.printStackTrace(); 
     return new byte[0]; 
    } catch (InvalidAlgorithmParameterException ex) { 
     System.err.println("[ERR] Cryptographer could not encrypt a message because the parameters are invalid."); 
     ex.printStackTrace(); 
     return new byte[0]; 
    } 
    try { 
     return this._cipher.doFinal(message); 
    } catch (IllegalBlockSizeException ex) { 
     System.err.println("[ERR] Cryptographer could not encrypt a message due to an illegal block size."); 
     ex.printStackTrace(); 
     return new byte[0]; 
    } catch (BadPaddingException ex) { 
     System.err.println("[ERR] Cryptographer could not encrypt a message due to bad padding."); 
     ex.printStackTrace(); 
     return new byte[0]; 
    } 
} 

そして、それは復号化機能によって復号化されます:

キーは暗号研究クラスのこの機能で生成され

暗号化は正常に機能しているようですが、シリアル番号を復号化しようとすると受信側のzedオブジェクトで、InvalidKeyExceptionがスローされます。コントローラーとエージェントで独立して生成されたキーを比較すると、同じパスワードを使用していても同じキーが生成されていないことがわかります。

は今、私はJavaでの暗号化に新しいですので、それは私が間違ってここで何かをやっていることは完全に可能です。これにはランダムな要素があるため、私は見当たりません。目標は、接続の両側で同一のパスワードから同一の鍵を生成することです。それで私がやっていることは明らかに間違っていますか?より多くのコードを参照する必要がある場合は、私に教えてください。私はそれを投稿して喜んでされます。

+1

おそらく、あなたは同じ塩を使用していませんか? – CodesInChaos

答えて

0

InvalidKeyExceptionがスローされているが、私は鍵が受信側で使用されている方法を見てしまうことを私に示しています。それをデータベースやファイルに保存していますか?データを暗号化するのに使用されたのと同じエンコーディングになっていますか?

+0

鍵を生成するために使用されるパスワードは、アプリケーションに読み込まれ、キー生成関数を通過し、その後、平文で格納されています。 – GradysGhost

関連する問題