私はJavaでインスタントメッセージングアプリケーションを使用しています。私はDemonstrate the use of RSA Public-key system to exchange messages that achieve confidentiality and integrity/authenticationで解説されているようにRSAアルゴリズムを実装しようとしましたが、受信したメッセージは正しく解読されません。クライアント - サーバーアプリケーションでRSAを使用すると "UnsupportedEncodingException:SHA"
スタックトレース:
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);
}
}
?
SHAはSHA1を意味しますか?その場合、マシンはFIPS構成で例外を生成していますか?それ以外の場合は、書式設定機能が適用されているシグネチャのエンコード方法で何かが交差しているように見えます。 – jww
@jwwこれまでのところ、私は問題をコンピューティングの署名部分で見つけました。私はMD5を試しましたが、同じエラーが発生しました。 **スタックトレース**のSHAを除いて、MD5がありました。しかし、私はまだ正確に何が問題なのか理解していません。 –
stacktraceは、あなたの 'decryptMessage'メソッドからのエラーを示していますが、あなたはそれを含めていません。文字列を作成するときに、文字エンコーディング名としてハッシュ関数名を渡そうとしているようです。 – matt