2011-07-20 16 views
2

私はアルゴリズムを使用してファイルを暗号化および復号化できましたが、AndroidからWASサーバーにファイルを送信しようとすると失敗します。ここでは暗号化側ここRSA AES復号化に失敗しました - InvalidKeyException

Security.addProvider(new BouncyCastleProvider()); 
    KeyGenerator keygen = KeyGenerator.getInstance("AES"); 
    SecureRandom random = new SecureRandom(); 
    keygen.init(random); 
    SecretKey key = keygen.generateKey(); 

    // wrap with RSA public key 
    ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream (getFileLocation(PUBLIC_KEY, localTest))); 
    Key publicKey = (Key) keyIn.readObject(); 
    keyIn.close(); 

    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.WRAP_MODE, publicKey); 
    byte[] wrappedKey = cipher.wrap(key); 
    DataOutputStream out = new DataOutputStream(new FileOutputStream(getFileLocation(SIGN_FILE, localTest))); 
    out.writeInt(wrappedKey.length); 
    out.write(wrappedKey); 

    InputStream in = new ByteArrayInputStream(message.getBytes()); 
    cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    crypt(in, out, cipher); 
    in.close(); 
    out.close(); 

    FileInputStream fis = new FileInputStream(getFileLocation(SIGN_FILE, localTest)); 
    byte[] buffer = new byte[fis.available()]; 
    int i =0; 
    while (i< buffer.length){ 
     buffer[i]= (byte)fis.read(); 
     i++; 
    } 
    String ss = encodeMsg(buffer); 
    return ss; 

は私のワークステーション上で、再度復号化側

 Security.addProvider(new BouncyCastleProvider()); 

     byte[] arr = decodeMsg(encrypted); 

      DataInputStream in = new DataInputStream(new ByteArrayInputStream(arr)); 
      int length = in.readInt(); 
      byte[] wrappedKey = new byte[length]; 
      in.read(wrappedKey, 0, length); 
      // unwrap with RSA private key 
      ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream (getFileLocation(PRIVATE_KEY, localTest))); 
      Key privateKey = (Key) keyIn.readObject(); 
      keyIn.close(); 
      Cipher cipher = Cipher.getInstance("RSA"); 
      cipher.init(Cipher.UNWRAP_MODE, privateKey); 
      Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY); 

      OutputStream out = new FileOutputStream(getFileLocation(DECRYPTED, localTest)); 
      cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.DECRYPT_MODE, key); 
      crypt(in, out, cipher); 
      in.close(); 
      out.close(); 

      FileInputStream fis = new FileInputStream(getFileLocation(DECRYPTED, localTest)); 
      byte[] buffer = new byte[fis.available()]; 
      int i =0; 
      while (i< buffer.length){//!= 0) { 
       buffer[i]= (byte)fis.read(); 
       i++; 
      } 
      String ss = new String(buffer); 
      return ss; 

されている、これは動作します。 WAS Webサーバーへのモバイル要求を実行すると失敗します。最初はオブジェクトクラスで議論していましたので、Java 1.6を使用してキーを再作成しました。私はJava 1.6に戦争を再コンパイルしました。それは以下のようなエラーです。

java.security.InvalidKeyException com.ibm.crypto.provider.RSA.engineUnwrap(Unknown Source) 
javax.crypto.Cipher.unwrap(Unknown Source) 
com.webapp.web.security.RSAEncrypt.decrypt(RSAEncrypt.java:161) 
com.webapp.web.MobileRequest.doPost(MobileRequest.java:81) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:738) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:831) 

をアンラップ--cipher ...

は、WAS環境をこれに対処するために更新する必要がありますか?アイデア? UPDATE keysizeが2048に設定されています

+1

これが問題であるかどうかわかりませんが、*すべての*デフォルトを取り除き、明示的な値に置き換えてください。 'getInstance(" RSA ")' getInstance( "RSA/ECB/PKCS1PADDING") 'を使わないでください。 'getBytes(" UTF-8 ")'を使う 'getBytes()'を使わないでください。 –

答えて

0

「Unlimited Jurisdiciton」ポリシーが機能するかもしれませんが、IBMJCEを成功させずに使用しようとしました。その後、私はSunJCEプロバイダ(バージョンJava 1.6)を使用するように切り替えました。これで、AndroidとWebsphereの両方で暗号化と復号化を行うことができます。管理者にBouncyCastleを有効にすることができるかどうかを調べるためにポリシーファイルを調べてもらうのですが、Sunのプロバイダファイルを使用しても問題ありません。

1

重要なポリシー設定が原因である可能性がありますが、両方のマシンに無制限強度管理ポリシーがインストールされていますか?このページの下部には、http://www.oracle.com/technetwork/java/javase/downloads/index.html

などがあります。それ以外の方法でデータをサーバーに送信していますか?

+0

サーバーがIBMのJVMを使用しているようですので、Oracleポリシーファイルは適用されません。 –

+0

サーバーがそれで設定されているかどうかわかりませんが、私は尋ねます – iowatiger08

関連する問題