2016-04-25 13 views
0

これは私が直面している状況です。私はログイン画面でアンドロイドのアプリを構築し、私のサーバーに送る情報を暗号化しています。私はBase64でデコードしているサーバー上のサーバーにそれを送信するためにアンドロイド上のBase64を使用して情報をエンコードしていますが、正しく暗号化していません。私のサーバーは暗号化パディングエラーを報告します。マルチプラットフォームBase64エンコーディングとデコードの問題(AndroidからPCへ)

これは、Android上の暗号化のためのコードです:

import android.util.Base64; 

    try { 
     plainText = user.getBytes("UTF-8"); 
     user = EncryptInfo(plainText, publicKey); 
    } catch (UnsupportedEncodingException ex) { 
     ex.getStackTrace(); 
    } 

private static String EncryptInfo(byte[] data,PublicKey key){ 
    Cipher cipher; 
    byte[] cipherText = null; 
    try { 
     cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     cipherText = cipher.doFinal(data); 
    } catch (NoSuchAlgorithmException ex) { 
     ex.getStackTrace(); 
     System.exit(1); 
    } catch (NoSuchPaddingException ex) { 
     ex.getStackTrace(); 
     System.exit(1); 
    } catch (InvalidKeyException ex) { 
     ex.getStackTrace(); 
     System.exit(1); 
    } catch (IllegalBlockSizeException ex) { 
     ex.getStackTrace(); 
     System.exit(1); 
    } catch (BadPaddingException ex) { 
     ex.getStackTrace(); 
     System.exit(1); 
    } 

    return Base64.encodeToString(cipherText, Base64.DEFAULT); 
} 

これは、データを復号化するサーバー上で私のPC上で実行されているコードです:

import java.util.Base64; 

//Decrypt the userpassword 
byte[] plainText = Base64.getDecoder().decode(encryptedData); 
inputLine = decryptData(plainText); 

private String decryptData(byte[] cipherText) throws UnsupportedEncodingException{ 
    // decrypt the ciphertext using the private key 
    Cipher cipher; 
    byte[] newPlainText = null; 
    try { 
     cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, privateKey); 
     newPlainText = cipher.doFinal(cipherText); 
     //System.out.println("Finish decryption: "); 
     //System.out.println(new String(newPlainText, "UTF8")); 
    } catch (NoSuchAlgorithmException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NoSuchPaddingException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InvalidKeyException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IllegalBlockSizeException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (BadPaddingException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return new String(newPlainText, "UTF8"); 
} 

私は輸入私を含めましたbase64のために使用しています。これはコード全体ではなく、関連するビットでもあります。私はbase64を完全に理解していないし、私の検索は私を答えに導かないので、どんな助けも非常に高く評価されるだろう!

編集:私がこれをやっているのは、ログイン資格情報を安全にサーバーに移送するためです。これは私のデスクトップアプリケーションでうまく動作します。私はデスクトップアプリケーションからコードをコピーしましたが、エンコーディングは変更が必要な唯一のものでした。私はベース64が問題の一部だと信じています。私はamdを実行するので私は自分の携帯電話でそれを実行する必要があるので、アプリケーションをデバッグすることはできません。

+0

しかし、base64を使っているのは何ですか? 7bit時代はもう終わった。 –

+0

あなたはbase64が問題だと思いますか?そうであれば、暗号化を複雑にすることなく、両端でいくつかのデバッグを特定するのは簡単です。 –

+0

私は簡単にソケット上と可能なストレージの上にデータを移動しようとしています。もう一度私はbase64についてよく分かりませんが、私のデスクトップアプリケーションではうまくいきました。私は同じコードから自分のアンドロイドアプリをベースにしています。もし私がそれを取り除くことができれば、他の何かを使うことができればそれはすばらしいでしょう。 Androidには古いバージョンのcommonsライブラリが含まれているので、更新されたものを使用しようとすると、単にencodeAsStringメソッドが見つからないと言います。 –

答えて

1

回答:

return Base64.encodeToString(cipherText, Base64.NO_WRAP); 

私は暗号化されたデータは、中間点で切断されていたことが判明し、デバッグした後。 Base64.No_Wrapを使用して私の問題を解決しました。投稿するだけですべてが分かります。 Androidの開発は私には新しいものなので、私はそれについても考えなかったと思います。

+0

これはbase64の問題のようには見えず、Androidプログラミングとも関係ありません。この問題は、あなたのデータが1行(あなたの投稿されたコードには表示されません)にあることを期待しているようです。通常、bass64データの行の長さも制限されているため、エンコードされたデータは複数の行で構成されます。 [Wikipedia article for base64](https://en.wikipedia.org/wiki/Base64)も参照してください。 –

関連する問題