我正在做RSA聊天Messenger(单个服务器,多个客户端)。我包括了send,decrypt,exit按钮。当客户端将消息从一个客户端发送到另一客户端时,接收消息的客户端以加密形式获取它,然后单击解密按钮以获得原始消息。但是,当我单击解密按钮时,我得到AWT-EventQueue-0“ java.lang.NumberFormatException并在解密部分得到了奇怪的字符。

这是我的代码:

private String bytesToString(byte[] encrypted) {
    // TODO Auto-generated method stub
    //return null;
    String test = "";
    for (byte b : encrypted) {
        test += Byte.toString(b);
    }
    return test;
}

public static void main(String ... args) {

    // take username from user
    String name = JOptionPane.showInputDialog(null,"Enter your name :", "Username",
         JOptionPane.PLAIN_MESSAGE);
    String servername = "localhost";  
    try {
        new ChatClient( name ,servername);
    } catch(Exception ex) {
        out.println( "Error --> " + ex.getMessage());
    }

} // end of main

// inner class for Messages Thread
class  MessagesThread extends Thread {
    public void run() {
        String line;
        try {
            while(true) {
                line = br.readLine();
                taMessages.append(line + "\n");
            } // end of while
        } catch(Exception ex) {}
    }
}
public class RSA {

    private BigInteger p;
    private BigInteger q;
    private BigInteger N;
    private BigInteger phi;
    private BigInteger e;
    private BigInteger d;
    private int bitlength = 1024;
    private int blocksize = 256; //blocksize in byte

    private Random r;
     public RSA() {
        r = new Random();
        p = BigInteger.probablePrime(bitlength, r);
        q = BigInteger.probablePrime(bitlength, r);
        N = p.multiply(q);

        phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
        e = BigInteger.probablePrime(bitlength/2, r);

        while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0 ) {
            e.add(BigInteger.ONE);
        }
 d = e.modInverse(phi); 
    }

    public RSA(BigInteger e, BigInteger d, BigInteger N) {
        this.e = e;
        this.d = d;
        this.N = N;
    } 
    private String bytesToString(byte[] encrypted) {
        String test = "";
        for (byte b : encrypted) {
            test += Byte.toString(b);
        }
        return test;
    }

 //Encrypt message
     public byte[] encrypt(byte[] message) {     
        return (new BigInteger(message)).modPow(e, N).toByteArray();
    }

// Decrypt message
    public byte[] decrypt(byte[] message) {
        return (new BigInteger(message)).modPow(d, N).toByteArray();
    } 
}

class Eavesdropper implements ActionListener {
    JTextArea myTextArea;
            public Eavesdropper(JTextArea ta) {
        myTextArea = ta;
    }
       public void actionPerformed(ActionEvent e) {
           RSA rsa = new RSA(); 
        //      String teststring = tfInput.getText();
      //    byte[] encrypted = rsa.encrypt(teststring.getBytes());  
        String text1 = taMessages.getText();
        String[] parts =text1.split("-");
           String part1=parts[1];
        part1 =part1.replaceAll("\n", "");
        byte[] b = part1.getBytes();
        byte[] decrypted = rsa.decrypt(b);       
        //RSAEncryption rsa=new RSAEncryption(1024);
    //  BigInteger plaintext = new BigInteger(part1.getBytes());
      //    BigInteger ciphertext = rsa.encrypt(plaintext);
        //String plaintext3 = rsa.decrypt(part1);
        //String text2 = new String(plaintext3.toByteArray());

              //    myTextArea.append(plaintext3);
        myTextArea.append("Decrypted String:" + new String(decrypted));
    }
}



} //  end of client

===============>>#1 票数:0

根据文档

Throws: NumberFormatException - val is zero bytes long.

http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html#BigInteger(字节[])

  ask by user3552965 translate from so

未解决问题?本站智能推荐:

1回复

Java中的安全Messenger

在Java中创建Secure Instant Messenger时,如果有很多客户端,例如3个客户端,则客户端A,B,CA都希望同时连接到B和C。 那么我需要分别为它们创建不同的套接字连接吗? 如果不是这样的话,这是一个限制,例如是否有10,000个客户端,每个客户端都想连接到其余客户端,因
1回复

Java中的错误填充异常(RSA解密)

解密java中的RSA Base64编码字符串时遇到一些问题。RSA加密字符串由c#.Net生成。 实际上,我使用java创建了一个公共和私有密钥。 然后,我将公共密钥交换给.Net团队。 他们通过使用公共密钥和RSACryptoServiceProvider类对字符串进行加密。
1回复

java / android中的数字签名(RSA密钥)

我想在我的java / android项目中使用存储在DB中的私钥(RSA)生成数字签名。 我的2个密钥是使用以下代码生成的( 项目正在生产中,我无法更改 ): 基于不同的站点( 这里和这里 ),我将尝试编写用于生成签名的代码: 为验证签名,我在我的java API中使用此
1回复

Java:RSA中的错误填充异常

我正在运行以下代码,我收到了Bad Padding Exception - Data must start with zero 。 有任何想法吗? 这是代码 这是我用于加密/解密的方法:
1回复

在JAVA中读取格式为PKCS1的RSA私钥

是否可以在JAVA中读取格式为PKCS1的RSA私钥而无需转换为PKCS8? 如果是,请欣赏示例代码。
1回复

Java中的数字格式异常,输入错误

使用代码时 如果用户输入add,则假定要完成上述过程,在Collage类(langara)中,有一个“ addStudent”方法: 然后使用构造函数创建学生类的学生对象: 我收到错误消息: 好像正在尝试将Student名称转换为long,但是应该将Student
3回复

如何处理Java中的数字格式异常?

我在我的机器上运行一个简单的applet。请注意,当执行applet尝试运行applet时,会发生“数字格式异常”错误。 显示以下代码 使用的命令是 终端输出: 所以我的问题是为什么会发生此错误以及通常何时发生?还建议对代码进行一些必要的更改以使代码运行时不会出现任何错
2回复

Java程序长数组中的数字格式异常?

我正在编写用于接受一些非常大的数字(10 ^ 8阶)的代码,并且我的程序引发了数字格式异常。 这是代码: 谁能告诉我我在哪里做错了? 错误:
4回复

Java Servlet中的数字格式异常

我在Tomcat服务器上运行的Eclipse中制作了一个简单的servlet。 我正在运行一个简单的Java应用程序,该程序将字符串message=20传递给servlet。 Servlet获取数据。 我在用 获取传递的字符串。 当我将名称值返回给应用程序时,我可以将其取回。
4回复

java中的十六进制到int数字格式异常

我在尝试这样做时遇到了数字格式异常 如果我减少它转换的十六进制数中的一个数字,但不是。 为什么以及如何解决这个问题?