当前位置: 首页 > 知识库问答 >
问题:

使用ObjectOutputStream发送公钥的字节数组,加密某些内容,并将加密的版本发回

缪征
2023-03-14

所以我有一个服务器端的公钥和私钥,我的目的是把公钥发给客户端,客户端会用密钥加密一个字符串,然后通过流发送字节数组,服务器会解密字节数组。

例外情况:

javax.crypto.BadPaddingException:解密错误

代码:

发送编码密钥。

                    handler.getOos().writeObject(publicKey.getEncoded());
                    handler.getOos().flush();

接收(编码密钥的)字节数组:

                        Object o = ois.readObject();
                        if (o instanceof byte[]) {
                            JChat.get().setServerPublicKey(KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec((byte[]) o)));
                            JChat.get().go();
                        }

go()方法(这里我使用一个DataOutputStream来发送字节数组):

public void go() {
    String text = "hello darkness my old friend";
    byte[] encrypted = encrypt(text, serverPublicKey);
    try {
        handler.getDos().write(encrypted);
        handler.getDos().flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在服务器端读取字节数组:

                        int count = dis.available();
                        byte[] in = new byte[count];
                        dis.readFully(in);
                        System.out.println(Server.decrypt(in, Server.get().getPrivateKey()));

decryption方法抛出此异常:

javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at com.archiepking.Server.decrypt(Server.java:97)
at com.archiepking.net.ClientHandler$1.run(ClientHandler.java:44)
at java.lang.Thread.run(Thread.java:745)

关于我做错了什么有什么建议吗?请注意:

Dos=DataOutputStream Dis=DataInputStream Oos=ObjectOutputStream Ois=ObjectInputStream

我正在使用两个不同的套接字,一个用于发送对象,一个用于数据类型(因为我的聊天应用程序将需要两者)。

我可以做什么来修复这个错误?

更多信息:密钥的生成:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.genKeyPair();
        byte[] publicKeyBytes = keyPair.getPublic().getEncoded();
        FileOutputStream fosPublic = new FileOutputStream("public");
        fosPublic.write(publicKeyBytes);
        fosPublic.close();

        byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();
        FileOutputStream fosPrivate = new FileOutputStream("private");
        fosPrivate.write(privateKeyBytes);
        fosPrivate.close();

        publicKey = keyPair.getPublic();
        privateKey = keyPair.getPrivate();

共有1个答案

百里弘致
2023-03-14

如果您使用的是ObjectOutputStream,为什么还要使用GetEncoded将公钥转换为字节数组呢?可以直接序列化对象。例如handler.getoos().WriteObject(publicKey);或者如果必须使用编码版本,则删除ObjectOutputStream,改用ByteArrayOutputStream。

 类似资料:
  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(

  • 问题内容: 我需要使用公钥(pem文件)对字符串进行加密,然后使用私钥(也为pem)对其进行签名。 我正在加载pem文件: 但是经过数小时的搜索,我似乎无法找到一种使用公钥加密数据的方法。在php中,我只是调用openssl_public_encrypt,但在节点或任何模块中都看不到任何相应的功能。 如果有人有任何建议,请告诉我。 问题答案: 没有图书馆必要的朋友, 输入密码 这是一个简单的小模块

  • 我正在使用OpenSSL RSA API用服务器的公钥加密数据。 我使用的是,所以RSA应该可以轻松地用256字节的公钥加密255字节。但我收到了: 我改变dl(data_lenght)到256(只有1),我得到了这个: 我知道RSA可以用256个密钥编码255个字节。有什么问题吗?

  • 问题内容: 我想使用公共密钥加密技术在JavaScript中加密,在PHP中解密。我一直在尝试找到可以完成此任务的库,但是遇到了问题。 我目前正在使用 openpgpjs ,但是我需要所有浏览器的支持,甚至测试页在唯一列为受支持的浏览器(Google Chrome)上都有错误。 关于最终目标的注意事项: TCP连接已受SSL保护。 此保护层的主要目的是防御有意或无意的Web服务器日志记录,崩溃转储

  • 我的Android应用程序实现了RSA加密,但后端无法解密应用程序生成的令牌。这是代码,公钥的开始行和结束行在调用之前都被删除了,会有什么问题吗? 后端团队提供了以下可以工作的示例代码,但它是针对桌面Java的。Android库没有base64.getEncoder方法。这和我写的非常相似,但我的就是不起作用。 我比较了每一步的字节数组值。桌面密码和android密码得到的输入完全相同。然而,来自

  • 在那里~我是新来的flutter开发,我试图使用Node.js服务器发送一个公钥到flutter加密密码但是,它就是不工作,我试图通过JSON格式或通过PEM文件的flutter和使用[Flutter]-加密和[Flutter]-simple_rsa库做加密,但它仍然不能工作。我怎么能这么做?请帮忙,多谢。 [Node.js]-使用[Node rsa]创建密钥[Flatter]-使用[encryp