Java sshtools сгенерировал подпись EDDSA, не совпадающую с сгенерированной подписью пикриптома PythonJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java sshtools сгенерировал подпись EDDSA, не совпадающую с сгенерированной подписью пикриптома Python

Сообщение Anonymous »

У меня есть библиотека Python, которая использует библиотеку pycryptodome для подписи данных с использованием алгоритма Ed25519 с использованием закрытого ключа ED25519 формата openssh. Затем подпись необходимо проверить в приложении Java с использованием библиотеки sshtools с соответствующим открытым ключом. Однако проверка подписи не удалась.
Ограничение: важно читать закрытые/открытые ключи из файлов. Я не могу изменить код Python и/или используемые ключи.
Для отладки я написал реализацию для генерации подписи на Java, а также для проверки подписи, сгенерированной Python. Однако оба они разные.
Моя реализация Python для подписи данных следующая:

Код: Выделить всё

from Crypto.Hash import SHA512
from Crypto.PublicKey import ECC
from Crypto.Signature import eddsa
import base64
import json

def generate_signature_v1(message):
message = message.replace(" ", "")
h = SHA512.new(message.encode("utf-8"))
with open("private", "r") as f:
key = ECC.import_key(f.read())
signer = eddsa.new(key, "rfc8032")
signature = signer.sign(h)
str_signature = base64.standard_b64encode(signature).decode("utf-8")
return str_signature
Моя реализация Java для генерации и проверки подписи.

Код: Выделить всё

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.io.File;
import java.io.IOException;

import com.google.gson.Gson;
import com.sshtools.common.publickey.InvalidPassphraseException;
import com.sshtools.common.publickey.SshKeyUtils;
import com.sshtools.common.ssh.components.SshKeyPair;
import com.sshtools.common.ssh.components.SshPrivateKey;
import com.sshtools.common.ssh.components.SshPublicKey;

public class StackOverflow {
private static final Gson gson = new Gson();

public static boolean verifyV1Signature(String message, String signature) {
try {
byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] hash = digest.digest(messageBytes);

// read public key
SshPublicKey readPublicKey = SshKeyUtils.getPublicKey(new File("public.pub"));

// verify signature
Base64.Decoder decoder = Base64.getDecoder();
byte[] signatureDecoded = decoder.decode(signature);
boolean isVerified = readPublicKey.verifySignature(signatureDecoded, hash);
System.out.println("signature is valid: " + isVerified);

return isVerified;
} catch (Exception e) {
return false;
}
}

public static String generateV1Signature(String message)
throws NoSuchAlgorithmException, IOException, InvalidPassphraseException {
byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] hash = digest.digest(messageBytes);

// create signature
SshKeyPair readKeyPair = SshKeyUtils.getPrivateKey(new File("private"));
SshPrivateKey readPrivateKey = readKeyPair.getPrivateKey();
byte[] signature = readPrivateKey.sign(hash);
Base64.Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(signature);
}

public static void main(String[] args) {
Map data = new HashMap();
data.put("key", "value");
String message = gson.toJson(data);
String pythonSignature = "5Sdt3bIKFbLBhbZ2JLzQP+8MNX6/uzFtxHTkBa/UIpBbjtwKfNu+wfcMHmxksQkmzI5OMhEpY46hVlkM0P5nAA==";
verifyV1Signature(message, pythonSignature);

try {
String javaSignature = generateV1Signature(message);
System.out.println(javaSignature);
} catch (NoSuchAlgorithmException | IOException | InvalidPassphraseException e) {
e.printStackTrace();
}
}
}
Выполнение кода Python для сообщения json.dumps({"key": "value"}) дает 5Sdt3bIKFbLBhbZ2JLzQP+8MNX6/uzFtxHTkBa/UIpBbjtwKfNu+wfcMHmxksQkmzI5OMhEpY46hVlkM0P5nAA==
При выполнении Java-кода выдается xHgYq8/nUYOkpbGzCsUkei9Vw0O1/XKoYZlLAbsUPpQF3cTMQ96ROL/ZHSH+cUUNJlmTI2Qb2thAU3kEqvdHBQ==, а также происходит сбой проверки.
Частный code> выглядит как -----BEGIN OPENSSH PRIVATE KEY ----- -----END OPENSSH PRIVATE KEY -----, а открытый ключ выглядит как ssh-ed25519 < вещи>
Почему подпись не совпадает? Я также попробовал jumpycastle, но подпись все равно не совпадает.

Подробнее здесь: https://stackoverflow.com/questions/788 ... ycryptomes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»