1

RSAが秘密鍵でデータを暗号化するJavaプログラムがあります:

    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で行っていることを複製する方法はありますか?

4

2 に答える 2

3

あなたは混乱していると思います。秘密鍵でデータを「暗号化」しません。誰でも解読できるので、それは価値がありません。秘密鍵で署名し(誰でも検証できるように) 、公開鍵で暗号化します(秘密鍵の所有者だけが解読できるようにします)。そのため、openssl API には、暗号化を行うものと署名を行うものがあります。RSA_public_encryptRSA_private_encrypt

于 2012-08-27T15:30:17.390 に答える
0

何をしようとしても、JavaでOpenSSLを使用する必要はまったくありません。Javaには独自の暗号ライブラリがあります。JCEリファレンスとjavax.cryptoパッケージを参照してください。

于 2012-08-27T22:00:44.857 に答える