Шифрование и дешифрование ключа AES с помощью ключа RSA - PullRequest
2 голосов
/ 23 марта 2020

Я должен сгенерировать ключ AES и у меня есть пара ключей RSA для приложения чата. Я должен зашифровать сообщение ключом AES, после чего зашифровать ключ AES ключом publi c RSA. После этого пользователь расшифровывает ключ AES с помощью закрытого ключа RSA и дешифрует сообщение с заданным ключом AES. Я проверил свой код, но после шифрования и дешифрования я получаю другой ключ AES с помощью publi c и закрытого ключа.

Я думаю, что у меня проблема с кодировкой / декодированием Base64 или использованием какой-либо ключевой функции, такой как key.getEncode c или key.toString.

Это мой код

public void sendMessage(User receiver, String message) throws Exception {

    //Generate AES key for encrypt message
    KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
    Integer keyBitSize=256;
    keyGenerator.init(keyBitSize);
    SecretKey simKey=keyGenerator.generateKey();
    System.out.println("AES KEY: "+simKey.getEncoded()+"\n");

    //Encrypt message
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, simKey);
    byte[] encMess1=cipher.doFinal(message.getBytes("UTF-8"));
    String messToWrite=Base64.getEncoder().encodeToString(encMess1);

    //Encrypt AES key
    byte[] KeyToEnc=simKey.getEncoded();
    cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, receiver.getPub());
    cipher.update(KeyToEnc);
    byte[] AESEncWrt=cipher.doFinal();
    String aeskeyString=new String(Base64.getEncoder().encodeToString(AESEncWrt));
    System.out.println("AES ENC:"+aeskeyString+"\n");

    //Decrypt AES key
    byte[] KeyToDec=Base64.getDecoder().decode(aeskeyString.getBytes());
    cipher.init(Cipher.DECRYPT_MODE, receiver.getPriv());
    cipher.update(KeyToDec);
    byte[] decAesKey=cipher.doFinal();
    System.out.println("AES DEC: "+decAesKey+"\n");


    //Write message and AES key in file
    BufferedWriter messFile=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+".txt"));
    System.out.println("WRITING TO FILE:"+messToWrite+"\n");
    messFile.write(messToWrite);
    messFile.close();
    BufferedWriter aeswrite=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+"key.txt"));
    System.out.println("WRT KEY:"+aeskeyString+"\n");
    aeswrite.write(aeskeyString);
    aeswrite.close();

    System.out.println("-------------------------------");
}

Извините, если мой код беспорядок.

1 Ответ

0 голосов
/ 23 марта 2020

Когда вы делаете это:

System.out.println("AES KEY: "+simKey.getEncoded()+"\n");

Вы не печатаете содержимое ключа, а просто «указатель» на байтовый массив. Когда вы расшифровываете, вы получаете новый byte[] с другим «указателем».

Вам необходимо напечатать фактическое содержимое, например, в шестнадцатеричном формате. Java имеет ограниченную поддержку шестнадцатеричной печати, но что-то вроде этого даст вам шестнадцатеричное представление байтового массива:

System.out.println(new BigInteger(1, simKey.getEncoded()).toString(16)); 

Обратите внимание, что в коде есть другие проблемы - например, вы игнорируете byte[] возвращается из cipher.update(..) или использования режима ECB с AES ..

...