2016-11-19 3 views
0

私はJavaでインスタントメッセージングアプリケーションを使用しています。私はDemonstrate the use of RSA Public-key system to exchange messages that achieve confidentiality and integrity/authenticationで解説されているようにRSAアルゴリズムを実装しようとしましたが、受信したメッセージは正しく解読されません。クライアント - サーバーアプリケーションでRSAを使用すると "UnsupportedEncodingException:SHA"

enter image description here

スタックトレース

java.io.UnsupportedEncodingException: SHA 
    at java.lang.StringCoding.decode(StringCoding.java:190) 
    at java.lang.String.<init>(String.java:426) 
    at java.lang.String.<init>(String.java:491) 
    at mychatappp.networking.MessageListener.decryptMessage(MessageListener.java:87) 
    at mychatappp.networking.MessageListener.run(MessageListener.java:115) 

サーバー側のrunメソッド

私は間違っているつもりです
ServerSocket server; 
int listenPort = 8877; 
WritableGUI gui; 
LoginScreen sc = new LoginScreen(); 

public MessageListener(WritableGUI gui, int port){ 
    this.listenPort = port; 
    this.gui = gui; 
    try { 
     server = new ServerSocket(port); 
    } catch (IOException ex) { 
     Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
public void decryptMessage(InputStream inStream) throws IOException, NoSuchAlgorithmException 
{ 
    try { 

     //Create the Data input stream from the socket 
     DataInputStream dis = new DataInputStream(inStream); 

     //Get the key 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx")); 

     PrivateKey privatekey = (PrivateKey) in.readObject(); 
     System.out.println("Key Used: " + in.toString()); 
     in.close(); 

     //Initiate the cipher 
     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");       
     cipher.init(Cipher.DECRYPT_MODE,privatekey); 

     int len = dis.readInt(); 
     byte[] encryptedMsg = new byte[len]; 
     dis.readFully(encryptedMsg);   

     System.out.println("Server - Msg Length: " + len); 
     System.out.println("Server - Encrypted: " + asHex(encryptedMsg)); 

     // -Print out the decrypt String to see if it matches the original message. 
     byte[] plainText = cipher.doFinal(encryptedMsg); 
     System.out.println("Decrypted Message: " + new String(plainText, "SHA")); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

//Function to make the bytes printable (hex format) 
public static String asHex(byte buf[]) { 
    StringBuilder strbuf = new StringBuilder(buf.length * 2); 
    int i; 
    for (i = 0; i < buf.length; i++) { 
     if (((int) buf[i] & 0xff) < 0x10) { 
      strbuf.append("0"); 
     } 
     strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
    } 
    return strbuf.toString(); 
} 

@Override 
public void run() { 
    Socket clientSocket; 

    try { 
     while((clientSocket = server.accept()) != null){ 
      InputStream is = clientSocket.getInputStream(); 
      decryptMessage(is); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      String line = br.readLine(); 
      if(line != null){ 
       gui.write(line); 
      } 
     } 

+0

SHAはSHA1を意味しますか?その場合、マシンはFIPS構成で例外を生成していますか?それ以外の場合は、書式設定機能が適用されているシグネチャのエンコード方法で何かが交差しているように見えます。 – jww

+0

@jwwこれまでのところ、私は問題をコンピューティングの署名部分で見つけました。私はMD5を試しましたが、同じエラーが発生しました。 **スタックトレース**のSHAを除いて、MD5がありました。しかし、私はまだ正確に何が問題なのか理解していません。 –

+0

stacktraceは、あなたの 'decryptMessage'メソッドからのエラーを示していますが、あなたはそれを含めていません。文字列を作成するときに、文字エンコーディング名としてハッシュ関数名を渡そうとしているようです。 – matt

答えて

1

このスニペットの問題はnew String(plainText, "SHA")です。 SHAは文字エンコーディングではありません。文字列がどのようにエンコードされているか(つまり、文字がバイトに変換される方法と逆の方法)はわかりませんが、おそらく"UTF-8"が必要です。

+0

うん、今は働いている。ソリューションメイトのおかげで、長い間ここにこだわっていた。 –

関連する問題