首页 > 解决方案 > 如何获取在 SSL/TLS 握手期间建立的对称密钥(会话密钥)以加密/解密消息?

问题描述

我正在 Android Studio 中创建一个聊天应用程序,它使用 TLS 来保护服务器和客户端之间的通信。一台设备是服务器,一台是客户端,我正在用 Java 编程。我已经建立了连接,并进行了握手。我正在使用 ECDHE_ECDSA_AES256_GCM_SHA256。如何获取在握手期间建立的密钥以在 AES 中用于数据路径消息的加密/解密?这是在后台完成的事情,还是我实际上必须实现密钥的建立?

这就是我想要做的:

public Message(PublicKey to, PublicKey from, String message, PrivateKey privateKey) {
   this.to = to;
   this.from = from;

   Cipher cipher = null;
   try {
       cipher = Cipher.getInstance(Constants.ENCRYPTION_ALGORITHM_AES);
       cipher.init(Cipher.ENCRYPT_MODE, to);
       this.ciphertext = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
      
       // Signature
       ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
       signatureStream.write(to.getEncoded());
       signatureStream.write(from.getEncoded());
       signatureStream.write(this.ciphertext);

       Signature signature = Signature.getInstance(Constants.SIGNATURE_ALGORITHM);
       signature.initSign(privateKey);
       signature.update(signatureStream.toByteArray());
       this.signature = signature.sign();
       this.plaintext = message;

   } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IOException | SignatureException | BadPaddingException | IllegalBlockSizeException e) {
       e.printStackTrace();
   }
}

这是我得到的例外:

2021-03-23 08:57:04.278 24162-24162/com.example.testaware W/System.err: java.security.InvalidKeyException: No provider offers [AES, GCM, NoPadding] for EC key of class com.android.org.conscrypt.OpenSSLECPublicKey and export format X.509
    2021-03-23 08:57:04.279 24162-24162/com.example.testaware W/System.err:     at javax.crypto.Cipher.tryCombinations(Cipher.java:2922)
    2021-03-23 08:57:04.279 24162-24162/com.example.testaware W/System.err:     at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796)
    2021-03-23 08:57:04.279 24162-24162/com.example.testaware W/System.err:     at javax.crypto.Cipher.chooseProvider(Cipher.java:773)
    2021-03-23 08:57:04.279 24162-24162/com.example.testaware W/System.err:     at javax.crypto.Cipher.init(Cipher.java:1143)
    2021-03-23 08:57:04.280 24162-24162/com.example.testaware W/System.err:     at javax.crypto.Cipher.init(Cipher.java:1084)
    2021-03-23 08:57:04.280 24162-24162/com.example.testaware W/System.err:     at com.example.testaware.models.Message.<init>(Message.java:53)
    2021-03-23 08:57:04.280 24162-24162/com.example.testaware W/System.err:     at com.example.testaware.activities.ChatActivity.sendMessage(ChatActivity.java:186)
    2021-03-23 08:57:04.281 24162-24162/com.example.testaware W/System.err:     at com.example.testaware.activities.ChatActivity.lambda$setupUI$0$ChatActivity(ChatActivity.java:167)
    2021-03-23 08:57:04.281 24162-24162/com.example.testaware W/System.err:     at com.example.testaware.activities.-$$Lambda$ChatActivity$ISUZTD0SoBMpbbVEzHtgcAyds9E.onClick(Unknown Source:4)
    2021-03-23 08:57:04.281 24162-24162/com.example.testaware W/System.err:     at android.view.View.performClick(View.java:7862)
    2021-03-23 08:57:04.281 24162-24162/com.example.testaware W/System.err:     at android.widget.TextView.performClick(TextView.java:15004)
    2021-03-23 08:57:04.282 24162-24162/com.example.testaware W/System.err:     at android.view.View.performClickInternal(View.java:7831)
    2021-03-23 08:57:04.282 24162-24162/com.example.testaware W/System.err:     at android.view.View.access$3600(View.java:879)
    2021-03-23 08:57:04.282 24162-24162/com.example.testaware W/System.err:     at android.view.View$PerformClick.run(View.java:29359)
    2021-03-23 08:57:04.282 24162-24162/com.example.testaware W/System.err:     at android.os.Handler.handleCallback(Handler.java:883)
    2021-03-23 08:57:04.283 24162-24162/com.example.testaware W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:100)
    2021-03-23 08:57:04.283 24162-24162/com.example.testaware W/System.err:     at android.os.Looper.loop(Looper.java:237)
    2021-03-23 08:57:04.283 24162-24162/com.example.testaware W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:8167)
    2021-03-23 08:57:04.283 24162-24162/com.example.testaware W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    2021-03-23 08:57:04.284 24162-24162/com.example.testaware W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
    2021-03-23 08:57:04.284 24162-24162/com.example.testaware W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

标签: javaandroid-studiosslencryption

解决方案


推荐阅读