我如何使用openssl使用私钥加密(而不是签名),这在Java中是可能的?

我如何使用openssl使用私钥加密(而不是签名),这在Java中是可能的?,java,openssl,rsa,Java,Openssl,Rsa,我有一个java程序,RSA使用私钥加密数据: Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); PrivateKey privateKey = null; PublicKey publicKey = null; // Load certificate from keystore try { FileInputStream ke

我有一个java程序,RSA使用私钥加密数据:

    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

    PrivateKey privateKey = null;
    PublicKey publicKey = null;

    // Load certificate from keystore
    try {
        FileInputStream keystoreFileInputStream = new FileInputStream("keystore.jks");
        KeyStore keystore = KeyStore.getInstance("JKS");
        keystore.load(keystoreFileInputStream, "passphrase".toCharArray());

        try {
            privateKey = (PrivateKey) keystore.getKey("idm_key", "passphrase".toCharArray());

        } catch (UnrecoverableKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    } catch (Exception e) {
        // TODO broad exception block
        e.printStackTrace();
    }

    // Make the encrypted data.

byte[] toEncrypt = "Data to encrypt".getBytes();
    byte[] encryptedData = null;

    // Perform private key encryption 
    try {
        // Encrypt the data
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        encryptedData = cipher.doFinal(toEncrypt);

    } catch (Exception e) {
        // TODO broad exception block
        e.printStackTrace();
    }
我需要使用openssl做同样的事情。以下是我尝试的代码:

uint8_t *encryptedBytes = NULL;

const char* data = "Data to enrypt";
char *private_key_file_name = "privatekey.pem"

FILE *fp = fopen(private_key_file_name, "r");
RSA *rsa = RSA_new();

PEM_read_RSAPrivateKey(fp, &rsa, 0, "passphase");

size_t encryptedBytesSize = RSA_size(rsa);

encryptedBytes = malloc(encryptedBytesSize * sizeof(uint8_t));
memset((void *)encryptedBytes, 0x0, encryptedBytesSize);
fclose(fp);

int result = RSA_private_encrypt(strlen(data), data, encryptedBytes, rsa,RSA_PKCS1_PADDING);
这不会产生与Java实现相同的输出。相反,它生成通过在Java中对数据进行签名获得的输出,即

Signature rsa = Signature.getInstance("RSA");
rsa.initSign(privateKey);
rsa.update(toEncrypt);
byte [] signed = rsa.sign();

尽管这是我在RSA_private_encrypt文档中所期望的,但这不是我所需要的。有没有一种方法可以复制java代码在openssl中所做的工作?

我想您可能会感到困惑。您不能使用私钥“加密”数据。这毫无价值,因为任何人都可以解密它。您可以使用私钥进行签名(这样任何人都可以验证它)并使用公钥进行加密(这样只有私钥的持有者才能解密它)。这就是为什么openssl API具有执行加密的
RSA\u public\u encrypt
和执行签名的
RSA\u private\u encrypt

无论您尝试做什么,您根本不需要在Java中使用openssl。Java有自己的加密库。请参阅JCE参考资料和javax.crypto包。

我没有感到困惑,至少我不认为我感到困惑。还有一点背景:第一段java代码是由客户机提供给我的。除非我误解了,否则他们会按原样用私钥加密。我知道这是倒退,但他们就是这么做的。我需要用openssl做同样的事情。另请参见@JoshDubey-好吧,我的问题是他们做什么(这没有任何意义),不幸的是openssl api(乍一看)似乎不支持它。我想我的问题并不完全清楚。java代码的第一位作为示例介绍。我正在编写一个c程序,它需要模拟这种行为,因此需要OpenSSL。