Сервер и клиент отправляют свои открытые ключи Диффи-Хеллмана друг другу через TCP (протокол управления передачей). ), чтобы они могли генерировать общий секрет. Когда сервер отправляет свой открытый ключ клиенту в виде строки base64, я могу успешно преобразовать эту строку в байты на стороне клиента.
Проблема в том, что при преобразовании байтов в экземпляр PublicKey в отмеченной строке 9, я получаю сообщение об ошибке:
java.security.spec.InvalidKeySpecException: спецификация закодированного ключа не распознана: не удалось создать последовательность из byte[]: длина DER более 4 байтов: 33
Вот мой Java-код:
Код: Выделить всё
public boolean generateSharedSecret() throws Exception {
byte[] serverDiffieHellmanPublicKey = receiveDiffieHellmanPublicKey();
Log.e("String Length", String.valueOf(Base64.encodeToString(serverDiffieHellmanPublicKey, Base64.DEFAULT).length())); // Outputs 90.
Log.e("Bytes Length", String.valueOf(serverDiffieHellmanPublicKey.length)); // Outputs 64.
KeyFactory keyFactory = KeyFactory.getInstance("DH");
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(serverDiffieHellmanPublicKey);
PublicKey dhPublicKeyFromServer = keyFactory.generatePublic(x509EncodedKeySpec); // Line 9
// ...
}
public byte[] receiveDiffieHellmanPublicKey() {
try {
Socket socket = new Socket("185.255.95.248", 1211);
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String keyString = new String(buffer, 0, bytesRead);
return Base64.decode(keyString, Base64.DEFAULT);
} catch (Exception ignore) {}
}
generateSharedSecret();
Код: Выделить всё
const net = require("net");
const crypto = require("crypto");
const dh = crypto.createDiffieHellman(512);
const serverDiffieHellman = crypto.generateDiffieHellman(dh.getPrime());
net.createServer((socket) => {
socket.on("connect", () => socket.write(serverDiffieHellman.getPublicKey().toString("base64")));
}).listen(1211, "185.255.95.248", () => console.log("TCP server is running..."));
Подробнее здесь: https://stackoverflow.com/questions/788 ... on-in-java
Мобильная версия