RSA启用简单Java聊天 - 不是PKCS#1块类型2或零填充

时间:2014-04-24 04:36:54

标签: java encryption rsa

我创建了一个简单的java聊天应用程序。以下是

运行ChatClient.java - 显示用户输入用户名的对话框。然后生成私钥和公钥并存储在C:/ username / publickey,C:/ username / privatekey中。

当我们再次运行ChatClient.java时,重复上述步骤。

然后user1使用User2公钥(工作正常)以加密形式向User2发送消息(加密后,消息存储在文本文件中)然后User2点击解密按钮解密文本(从文件中读取加密文本)使用User 2私钥然后在textarea中显示。

当我尝试解密时,我收到“Not PKCS#1 block type 2或Zero padding”异常

public static byte[] encrypt(String text, PublicKey key) throws {
    // get an RSA cipher object and print the provider
    final Cipher cipher = Cipher.getInstance(ALGORITHM);
    // encrypt the plain text using the public key
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] cipherText = cipher.doFinal(text.getBytes("UTF8"));
    return org.apache.commons.codec.binary.Base64.encodeBase64(cipherText);
}

public static String decrypt(String text, PrivateKey key) throws  {
    byte[] dectyptedText = null;

      // get an RSA cipher object and print the provider
      final Cipher cipher = Cipher.getInstance(ALGORITHM);

      // decrypt the text using the private key
     cipher.init(Cipher.DECRYPT_MODE, key);
     byte[] byteCipherText =org.apache.commons.codec.binary.Base64.decodeBase64(text): 
     byte[] cipherData = cipher.doFinal(byteCipherText);
     return new String(dectyptedText);  
}

private void btnDecryptActionPerformed(ActionEvent evt) throws  {
    String name11 = this.getTitle();
    String test90 = null;
    String PRIVATE_KEY_FILE = "C:/keys/"+name11+"/private.key";
    BufferedReader in = null;
    try {
        in = new BufferedReader(new FileReader("cipher.txt"));
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        while(in.ready())
        {
            String stest= in.readLine();
            test90 = stest;


        }
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    ObjectInputStream inputStream = null;
    try {
    inputStream = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    PrivateKey privateKey = null;
    try {
        privateKey = (PrivateKey) inputStream.readObject();
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
    inputStream = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        PrivateKey privatekey = (PrivateKey) inputStream.readObject();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    String plainText;

//  byte[] test100 = test90.getBytes();
//  out.println(test100);
    plainText = decrypt(test90, privateKey); (Getting Error Here)
    decryptText.append(plainText);
} 

1 个答案:

答案 0 :(得分:1)

下面突出显示的代码表示test90仅包含cipher.txt文件中的最后一行。 cipher.txt只包含1行吗?如果你想阅读所有内容,你需要在阅读时连接每一行。

while(in.ready())
{
    String stest= in.readLine();
    test90 = stest;
}

System.out方法中test90变量decrypt也是一个好主意,以确保您获得要解密的预期base64数据。