我正在 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)