هذا هو الكود

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.NoSuchProviderException;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

public class CryptographyUtil {

private static final String ALGORITHM = "RSA";

public static byte[] encrypt(byte[] publicKey, byte[] inputData) throws Exception {

    PublicKey key = KeyFactory.getInstance(ALGORITHM)
            .generatePublic(new X509EncodedKeySpec(publicKey));

    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.PUBLIC_KEY, key);

    byte[] encryptedBytes = cipher.doFinal(inputData);

    return encryptedBytes;
}

public static byte[] decrypt(byte[] privateKey, byte[] inputData) throws Exception {

    PrivateKey key = KeyFactory.getInstance(ALGORITHM)
            .generatePrivate(new PKCS8EncodedKeySpec(privateKey));

    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.PRIVATE_KEY, key);

    byte[] decryptedBytes = cipher.doFinal(inputData);

    return decryptedBytes;
}

public static KeyPair generateKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException {

    KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);

    SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");

    // 512 is keysize       
    keyGen.initialize(512, random);

    KeyPair generateKeyPair = keyGen.generateKeyPair();
    return generateKeyPair;
}

public static void main(String[] args) throws Exception {

    KeyPair generateKeyPair = generateKeyPair();

    byte[] publicKey = generateKeyPair.getPublic().getEncoded();
    byte[] privateKey = generateKeyPair.getPrivate().getEncoded();

    byte[] encryptedData = encrypt(publicKey,"hi this is here".getBytes());

    byte[] decryptedData = decrypt(privateKey, encryptedData);

    System.out.println(new String(decryptedData));


}

}

هناك أشياء غير واضحة مثلا هذان السطران:

SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(512, random);

أيضا بناءا على ماذا تم توليد المفاتيح ؟ إذا كانت العملية عشوائية فكيف أضمن أن لايتم توليد مفتاحين بنفس بعضهم لمستخدمين في نظام معين؟ أنا كنت أظن أنني أنا أضع بعض القيم ويتم توليد مفاتيح منها . أيضا هناك إشكال آخر وهو أنني حاولت التشفير بالمفتاح الخاص وفكه بالعام هكذا :

byte[] encryptedData = encrypt(privateKey,"hi this is here".getBytes());

    byte[] decryptedData = decrypt(publicKey, encryptedData);