Hi, 

we have a server using OpenSLL crypto library functions around RSA.
I want to write a Java client that sends an encrypted message to the 
server, which can be decrypted there.

To test this I use the following Java code below:

The encoded public key is created with OpenSSL.
                RSA* rsa_private= RSA_generate_key (keylength, RSA_F4, 
NULL, NULL);
                len = i2d_RSA_PUBKEY(rsa_private, NULL);
                pBuffer=(char *)OPENSSL_malloc(len);
                upBuffer = (unsigned char*)pBuffer;
                len = i2d_RSA_PUBKEY(rsa_private, &upBuffer);
 
The server decrypts the password with the same private key used to 
generate the public key:
                retval = RSA_private_decrypt(RSA_size(rsa_private), 
encryptedPasswordCharArrayfromJavaClient, cleartext-output, rsa_private, 
RSA_NO_PADDING);

I tested my code so that encryption /  decryption works in the C code 
using OpenSSL.
I tested my Java code so that encryption /  decryption works in the Java 
code using standard Java packages with a Sun provider for RSA.
I have trouble to get the two together. If I use RSA_private_decrypt with 
a byte sequence created from the Java client the output is wrong - no 
error occurs.

One thing that might point to a reason for the incompatibility:
I observe that the Java client always creates the same encrypted byte 
sequence from a given input string and a public key.
The OpenSSL C client produces different encrypted byte sequences for each 
separate run with a given input string and a public key. Decryption works 
with all of them.
If I let the C client encrypt the same given input string twice in the 
same run, it creates the same encrypted sequence.

The java client code:

import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Date;

import javax.crypto.Cipher;

public class ClientX509Encryption {

        static final byte[] encodedPublicKey = {
            48, -127, -97, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 
1,
            5, 0, 3, -127, -115, 0, 48, -127, -119, 2, -127, -127, 0, -77, 
119, -61,
            76, -66, -58, -102, -98, 84, 20, 83, 117, -9, 69, 109, -105, 
51, -58, 12,
            31, -113, 110, -118, 20, 115, 107, -86, -97, 14, -39, 62, 8, 
50, -22, 65,
            121, -124, -52, 27, 17, -104, -123, -78, -56, 92, 18, -31, 
116, 69, 105, -96,
            -87, 44, 60, -115, -110, 8, -124, 59, -68, 54, 33, 63, 108, 
24, 114, -11,
            -103, -31, 48, -89, 10, 98, 106, -80, 123, -94, -100, -24, 
-59, 18, 112, 74,
            112, 58, -94, -23, 70, -41, 35, 92, 92, 26, -27, -51, 127, 
-125, -109, 15,
            -30, -18, -12, 27, 101, 92, 4, 77, 11, -22, 123, 47, -18, 88, 
-96, 95,
            32, -118, -128, 82, 22, -55, -39, 9, -34, 4, 90, 88, -17, 2, 
3, 1,
            0, 1,
        };

        public static void main(String[] args) {
 
                byte[] encryptedpassword = null;
 
                try {
                        Cipher c = Cipher.getInstance("RSA/ECB/NoPadding"
);

                        X509EncodedKeySpec publicKeySpec = new 
X509EncodedKeySpec(encodedPublicKey);

                        KeyFactory keyFactory = KeyFactory.getInstance(
"RSA");
                        PublicKey publicKey = 
keyFactory.generatePublic(publicKeySpec);

                        c.init(Cipher.ENCRYPT_MODE, publicKey);

                        byte[] arg0Bytes = args[0].getBytes();
 
                        // encrypt input parameter
                        encryptedpassword = c.doFinal(arg0Bytes);

                        System.out.print("static signed char 
encryptedPasswordStringfromJavaClient[] = {");
                        for (int i = 0; i < encryptedpassword.length; i++) 
{
                                if (i % 16 == 0) {
                                        System.out.println("");
                                        System.out.print("    ");
                                }
                                System.out.print(encryptedpassword[i] + ", 
");
                        }
                        System.out.println("\n};");
 
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }
}

Reply via email to