Java 如何使用匹配的DER私钥解密公共PEM密钥加密的字节数组?
因此,我正在创建一个基本的套接字程序,在这个程序中,我想向Java程序发送一个C格式的加密字符串。我的C程序使用公共PEM密钥加密字符串。我已经将匹配的私有PEM密钥转换为DER密钥,现在想解密发送到Java程序的字符串。我该怎么做 目前,我得到了一个非法的BlockSizeException,声明在尝试按原样运行代码时“数据不得超过256字节” 这就是我目前的情况: C客户端程序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
//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并发布它的完整代码。