所以我创建了一个基本的套接字程序,我希望将C中的加密字符串发送到Java程序。我的C程序使用公共PEM密钥加密字符串。我已将匹配的私有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);
}
答案 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模数大小。它可以用来 确定必须为加密的RSA分配多少内存 值。
但是,您不应该使用2048位密钥加密完整的256个字节。您希望始终使用带RSA加密的随机填充,并选择超过v1.5的OAEP。