Передача открытого ключа ECIES клиенту

Я новичок в ECIES и использую алгоритм ECIES для шифрования и дешифрования. Ниже приведен фрагмент кода, который я использую для механизма шифрования и дешифрования.

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

      // Server Side Generates KeyPair
      KeyPair keyPair = serverSideKeyGeneration();

      // Client receives the KeyPair or Public Key before sending actual call to server
      String originalString = "Hello";
      byte[] ecryptedBase64Data = clientSideCodeToGenerateEncryptedData(originalString, keyPair);
      System.out.println("Encrypted Data" + ecryptedBase64Data);

      // Server receives the encrypted Data and decrypt using Private Key
      String originalValue = decryptEncodedString(keyPair, ecryptedBase64Data);
      System.out.println(originalValue);

    }

    private static byte[] clientSideCodeToGenerateEncryptedData(String originalString, KeyPair keyPair) throws Exception{
       Cipher cipher = Cipher.getInstance("ECIES");
       cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
       byte[] ecryptedBase64Data = Base64.encode(cipher.doFinal(originalString.getBytes("UTF-8")));
       return ecryptedBase64Data;

    }

   private static KeyPair serverSideKeyGeneration() throws Exception {
       Security.addProvider(new BouncyCastleProvider());

       KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES");
       kpg.initialize(new ECGenParameterSpec("secp256r1"));

       // Key pair to store public and private key
       KeyPair keyPair = kpg.generateKeyPair();

       // System.out.println(keyPair.getPublic());
       // System.out.println(keyPair.getPrivate());

       return keyPair;

   }

   private static String decryptEncodedString(KeyPair keyPair, byte[] ret) throws Exception {
       Cipher iesCipherServer = Cipher.getInstance("ECIES");
       iesCipherServer.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
       String originalValue = new String(iesCipherServer.doFinal(Base64.decode(ret)));
       return originalValue;

   }

Приведенный выше фрагмент кода работает нормально, но я хочу, чтобы перед любым взаимодействием между клиентом и сервером клиент отправлял запрос на запуск и получал открытый ключ в его конце. Затем зашифровывает полезную нагрузку с использованием открытого ключа и отправляет его на сервер, а после получения сервер расшифровывает данные с использованием ранее созданного закрытого ключа.

Когда я использую приведенный ниже фрагмент, чтобы сделать keyPair сохраненным как объект JSON, он выдает исключение:

    MobileData data = new MobileData();
    data.setKeyPair(keyPair);

    ObjectMapper mapper = new ObjectMapper();
    String jsonString = mapper.writeValueAsString(data);

Исключение:

org.codehaus.jackson.map.JsonMappingException: не найден сериализатор для класса org.bouncycastle.math.ec.WNafL2RMultiplier и не обнаружены свойства для создания BeanSerializer (чтобы избежать исключения, отключите SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) через ссылку: ["KeyPair"]->java.security.KeyPair["общественность"] -> [org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey "параметры"]->org.bouncycastle.jce.spec.ECParameterSpec[" кривая "]->org.bouncycastle.math.ec.custom.sec.SecP256R1Curve[" умножитель "])

Как я могу отправить открытый ключ клиенту?

1 ответ

Решение

Проблема в том, что KeyPair не может быть сериализовано как JSON. Вам нужно отправить только контент с открытым ключом

 public class MobileData{
        byte publicKeyEncoded[];
 }

MobileData data = new MobileData();
data.setPublicKeyEncoded(keyPair.getPublic().getEncoded());

ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(data);

Открытый ключ будет закодирован как base64 в строку json

Другие вопросы по тегам