java - 如何获取在 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)
解决方案
推荐阅读
- php - PHP Array from Database, set a row as Array title
- java - 我输入了正确的值,但打印了错误的值
- python - 枕头,如何将文字放在图像的中心
- julia - 使用 NLopt 作为 JuMP 的求解器
- swift - 我正在尝试在用户键入时查询 firebase 数据库,但我不断收到此错误
- java - 将整数对象转换为双掷错误
- r - 矩阵乘法(逐行)
- python - DatetimeIndexResampler 对象返回的第一个 Timestamp 的模式是什么?
- html - querySelector 似乎没有在 ng-container 中找到元素
- algorithm - 天真的 Lomuto 在 Quicksort 中的分区可以处理重复项吗?