Làm cách nào để xác minh chữ ký DSA trong C#?Xác minh chữ ký DSA trong C# đang sử dụng định dạng ASN.1 được mã hóa BER/DER
Given:
- nội dung tin nhắn,
- một digest ký (thường là ASN.1 định dạng DER),
- khóa công khai (trong một chứng chỉ X.509 ký, PEM hoặc DER định dạng)
tôi đã thử một số phương pháp, nhưng đã không có bất kỳ thành công:
OpenSSL.NET: nhiều lỗi lạ khác nhau với thư viện; Tôi đã có một số open thread running with the author over on SourceForge nhưng chưa thể giải quyết vấn đề này.
Microsoft .NET API: không thể giải nén chữ ký DER để so sánh. Chữ ký DSA là 40 byte (hai số nguyên 20 byte), nhưng được trình bày dưới dạng chuỗi DER được mã hóa gồm hai số nguyên, do đó tổng chiều dài có thể nằm trong khoảng từ 46 đến 48 byte (xem this post để có tổng quan nhanh). bao gồm mã để phân tích ASN.1/DER (vì nó có thể đọc chứng chỉ ở định dạng DER), nó được chôn sâu và không có cách nào để truy cập nó để bạn có thể truy xuất chính xác 40 byte từ sig được mã hóa ASN.1/DER. Vấn đề này dẫn tôi đến tùy chọn tiếp theo ...
BouncyCastle: thông qua việc sử dụng các
Org.BouncyCastle.Asn1
chức năng, tôi có thể phân tích chữ ký ASN.1 và kéo nó vào đó là thành phần R và các giá trị số nguyên S. Nhưng khi tôi vượt qua những thói quen xác minh chữ ký, nó không thành công mà không có lời giải thích nào được đưa ra. Tôi không chắc chắn nếu tôi đang làm điều gì sai trái, bởi vì C# API là hoàn toàn không có giấy tờ, và phiên bản Java là hầu như không ghi nhận (nhưng không có ví dụ hoặc HOWTO thông tin mà tôi có thể tìm thấy.)
Tôi đã ném bản thân mình vào vấn đề này trong khoảng một tuần nay. Tôi biết ai đó phải làm điều đó trước đây, nhưng tôi đã không tìm thấy bất kỳ ví dụ hoàn chỉnh/làm việc nào.
Tôi có ba dự án C# đang ngồi ở đây, mỗi 95% hoàn thành nhưng có một lỗ hổng quan trọng gây ra lỗi. Bất kỳ mã ví dụ làm việc nào cũng sẽ được đánh giá cao.
chỉnh sửa: đây là ví dụ về chữ ký tôi đang cố gắng xác minh, được chuyển đổi thành Base64 và ASCII hex để làm cho nó có thể đăng. cái này là 47 byte nhưng một phân tích cú pháp thích hợp vẫn phải chấp nhận nó, đọc lên trên spec DER để biết thêm (BER/DER thêm một lãnh đạo 00 để xác nhận dấu hiệu nếu MSB là 1)
Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=
ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933
Structure theo thông số DER; nó phân tích như sau:
30 2d: sequence, length 45 (may vary from 44 to 46)
02 15: integer, length 21 (first byte is 00 to confirm sign)
009482ad831075b3a773b89ce768dfc983bbc992b7
02 14: integer, length 20 (leading 00 not necessary for this one)
69d6666e29fb06f5f1a5ea0987b761aae0f60933
Viết phân tích cú pháp DER của riêng tôi thực sự không phải là một lựa chọn, quá nhiều chỗ cho sai sót và có nhận được một cách để làm điều này đúng.
Tôi đã tự hỏi nếu bạn có thể làm cho tôi một ưu tiên và thay đổi tiêu đề từ "Xác minh chữ ký DSA trong C#" để "Xác minh chữ ký DSA trong C# với định dạng ASN.1" hoặc một cái gì đó tương tự. Có thể giúp tìm kiếm người một chút. – Greg
Giống như một bình luận; Tôi đang đi theo cách khác (xác minh một chữ ký trong Java đã được tạo ra trong .NET); Tôi đã phải viết một trình chuyển đổi từ định dạng .NET DSA (chỉ là r || s trong 40 byte) sang định dạng DER. Theo những gì tôi tìm thấy ở đây (http://www.mombu.com/microsoft/security-crypto/t-dsa-signature-format-674106.html) định dạng DER dự kiến r và s là big-endian nhưng điều đó đã không 't làm việc ở tất cả vì vậy tôi để nó như là một chút nhỏ và nó hoạt động ... Tôi đã không tìm thấy bất cứ điều gì rất rõ ràng về điều này; có nên là người lớn hay nhỏ ... nếu có ai biết thì hãy kêu vang! – SonarJetLens