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

时间:2016-02-15 22:47:58

标签: java c sockets encryption

所以我创建了一个基本的套接字程序,我希望将C中的加密字符串发送到Java程序。我的C程序使用公共P​​EM密钥加密字符串。我已将匹配的私有PEM密钥转换为DER密钥,现在想要解密发送到我的Java程序的字符串。我该怎么做?

目前我收到一个IllegalBlockSizeException,声明"数据不得超过256个字节"当试图按原样运行代码时。

这就是我现在所拥有的:

C客户端程序......

SELECT
    ID
    ,Part
    ,Model
    ,ROW_NUMBER() OVER(PARTITION BY Model ORDER BY ID) AS Seq
FROM YourTable

Java解密......

 //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);
    }

1 个答案:

答案 0 :(得分:0)

除非您的RSA密钥超过16K,否则无法使用RSA加密2,048个字节。您可能有一个2048 RSA密钥,它将您限制在256字节以下。查看RSA_public_encrypt的openssl手册页:

  

flen必须小于 RSA_size (rsa) - 基于PKCS#1 v1.5的11   填充模式,小于RSA_size(rsa) - 41为RSA_PKCS1_OAEP_PADDING   并且RSA_NO_PADDING正好是RSA_size(rsa)。随机数   必须在调用RSA_public_encrypt()之前播种生成器。

RSA_size

  

RSA_size()以字节的形式返回RSA模数大小。它可以用来   确定必须为加密的RSA分配多少内存   值。

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