Điểm:2

Tạo và xác thực chữ ký bằng khóa riêng mở rộng ED25519

lá cờ jp

Tôi đang xây dựng một ứng dụng nhắn tin được mã hóa qua mạng tor và hiện tại tôi đang gặp khó khăn khi sử dụng khóa riêng ed25519 do tor tạo để ký và xác minh bất kỳ tin nhắn nào.

Tuy nhiên, đoạn mã dưới đây hoạt động với khóa 32 byte sau khi bỏ qua 32 byte tiêu đề của hs_ed25519_secret_key nó không thể xác minh chữ ký trong các trường hợp dưới đây:

1 - bí mật: nửa trái của 64 byte còn lại, công khai: nửa phải
2 - bí mật: nửa còn lại của 64 byte còn lại, công khai: 32 byte cuối cùng của hs_ed25519_public_key sau khi loại bỏ tiêu đề
3 - bí mật: tất cả 64 byte, công khai: 32 byte cuối cùng của hs_ed25519_public_key

Tôi đã tìm thấy một thư viện python dường như làm được điều này PyNaCl tuy nhiên tôi không quen thuộc với py quá nhiều.

Có điều gì đó tôi đang làm sai hoặc bouncycastle không hỗ trợ khóa riêng 64 byte mở rộng

nhập org.bouncycastle.crypto.Signer;
nhập org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
nhập org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
nhập org.bouncycastle.crypto.signers.Ed25519Signer;
nhập java.nio.charset.StandardCharsets;
lớp công khai ED25519 {
    public static void main(String[] args) ném Ngoại lệ {
        byte[] message = "một thông điệp cần ký".getBytes(StandardCharsets.UTF_8);
        Người ký người ký = new Ed25519Signer();
        signer.init(true, new Ed25519PrivateKeyParameters(KeysUtil.myPrivKey, 0));
        signer.update(tin nhắn, 0, message.length);
        Trình xác minh người ký = new Ed25519Signer();
        verifier.init(false, new Ed25519PublicKeyParameters(KeysUtil.myPubKey, 0));
        verifier.update(message, 0, message.length);
        boolean hợp lệSig = verifier.verifySignature(signer.generateSignature());
    }
}

```
Điểm:1
lá cờ es

Mã của bạn vẫn ổn nếu bạn yêu cầu BouncyCastle tạo cặp khóa:

var gen = new Ed25519KeyPairGenerator();
gen.init(Ed25519KeyGenerationParameters mới(SecureRandom()) mới);
var keyPair = gen.generateKeyPair();
var sk = byte mới[32];
((Ed25519PrivateKeyParameters) keyPair.getPrivate()).encode(sk, 0);
var pk = ((Ed25519PublicKeyParameters) keyPair.getPublic()).getEncoded();

Lý do nó không hoạt động với cặp khóa Tor của bạn là vì BouncyCastle không tính toán khóa chung bằng phép nhân vô hướng của điểm cơ sở với khóa bí mật nhỏ-endian của bạn.

Thay vào đó, nó theo sau RFC 8032 và thực hiện SHA-512 trên tài liệu khóa ban đầu của bạn, xóa và đặt một số bit nhất định, sau đó sử dụng mã đó làm khóa bí mật để xác định khóa chung.

Nó đang làm điều này:

MessageDigest md = MessageDigest.getInstance("SHA-512");
byte [] digest = md.digest(initialKeyMaterial);
var sk = subarray(digest, 0, 32);
sk[0] &= 248;
sk[31] &= 127;
sk[31] |= 64;
var pk = basePoint.scalarMultiply(sk);

Nếu khóa bí mật bạn đang chỉ định đã trải qua quá trình chuyển đổi SHA-512 này, thì mã của bạn không thành công vì mã hiện đang thực hiện SHA-512 hai lần. Vì bạn không thể đảo ngược thao tác SHA-512 nên nếu phải sử dụng BouncyCastle, bạn sẽ cần tạo khóa bí mật của mình trong BouncyCastle rồi sử dụng khóa đó với tor, thay vì ngược lại.

Tuy nhiên, vì bạn có thể cần phải bắt đầu với cặp khóa Tor, nên bạn có thể cân nhắc sửa đổi mã BouncyCastle để không thực hiện chuyển đổi SHA-512 trước khi sử dụng nó làm khóa ký.

Miliano avatar
lá cờ jp
Hmm, cảm ơn vì lời khuyên, tôi sẽ cố gắng làm lại quy trình ký vì tôi không thể sử dụng cặp khóa do BC tạo ra khi sau này tôi cần sử dụng địa chỉ ảo nhanh với mkp224o đang tạo khóa mở rộng 64 byte như tor.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.