Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用匹配的DER私钥解密公共PEM密钥加密的字节数组?_Java_C_Sockets_Encryption - Fatal编程技术网

Java 如何使用匹配的DER私钥解密公共PEM密钥加密的字节数组?

Java 如何使用匹配的DER私钥解密公共PEM密钥加密的字节数组?,java,c,sockets,encryption,Java,C,Sockets,Encryption,因此,我正在创建一个基本的套接字程序,在这个程序中,我想向Java程序发送一个C格式的加密字符串。我的C程序使用公共PEM密钥加密字符串。我已经将匹配的私有PEM密钥转换为DER密钥,现在想解密发送到Java程序的字符串。我该怎么做 目前,我得到了一个非法的BlockSizeException,声明在尝试按原样运行代码时“数据不得超过256字节” 这就是我目前的情况: C客户端程序 //Get our public key from the publickey file created by

因此,我正在创建一个基本的套接字程序,在这个程序中,我想向Java程序发送一个C格式的加密字符串。我的C程序使用公共PEM密钥加密字符串。我已经将匹配的私有PEM密钥转换为DER密钥,现在想解密发送到Java程序的字符串。我该怎么做

目前,我得到了一个非法的BlockSizeException,声明在尝试按原样运行代码时“数据不得超过256字节”

这就是我目前的情况:

C客户端程序

 //Get our public key from the publickey file created by server
    FILE *publicKeyFile = fopen("publicKey.pem", "rb");
    RSA *rsa = RSA_new();
    rsa = PEM_read_RSA_PUBKEY(publicKeyFile, &rsa, NULL, NULL);
    if(rsa == NULL) {
            printf("Error with public key...\n");
    }
    else {
            //if the public key is correct we will encrypt the message
            RSA_public_encrypt(2048, sigMessage, sigMessage, rsa, RSA_PKCS1_PADDING);
    }
Java解密

    public static String decrypt(byte[] encryptedMessage) {

    try {
        Cipher rsa;
        rsa = Cipher.getInstance("RSA");
        PrivateKey ourKey = getKey("resources/privateKey.der");
        rsa.init(Cipher.DECRYPT_MODE, ourKey);
        byte[] utf8 = rsa.doFinal(encryptedMessage);
        return new String(utf8, "UTF8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static PrivateKey getKey(String filePath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {

        File f = new File(filePath);
        FileInputStream fis = new FileInputStream(f);
        DataInputStream dis = new DataInputStream(fis);
        byte[] keyBytes = new byte[(int) f.length()];
        dis.readFully(keyBytes);
        dis.close();

        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePrivate(spec);
    }
除非您的RSA密钥超过16K,否则无法使用RSA加密2048字节。您可能有一个2048位RSA密钥,该密钥限制在256字节以下。查看openssl手册页以了解:

对于基于PKCS#1 v1.5的系统,flen必须小于RSA#U大小(RSA)-11 填充模式,小于RSA_大小(RSA)-41用于RSA_PKCS1_OAEP_填充 而RSA_大小(RSA)用于RSA_无填充。随机数 在调用RSA_public_encrypt()之前,必须对生成器进行种子设定

以及:

RSA_size()返回RSA模数大小(以字节为单位)。它可以用来 确定必须为RSA加密文件分配多少内存 价值观


不过,您不应该使用2048位密钥加密完整的256字节。您希望始终使用RSA加密的随机填充,并选择OAEP而不是v1.5。

您需要提供更多的上下文,因为错误超出了代码段的范围。尝试创建一个MCVE并发布它的完整代码。