01/10/2018, 01:17

Giải mã dữ liệu khi cặp khóa public/private bị thu hồi/hủy?

chào mọi người, mình có hệ thống cho phép người dùng ký số vào tài liệu của mình. private để khóa dữ liệu và public để giải mã nhằm kiểm tra tính toàn vẹn của dữ liệu. cặp khóa này được lưu trữ trên database. nếu người dùng quên hoặc đã bị đánh cắp private key thì yêu cầu hệ thống thu hồi cặp khóa cũ và tạo lại cặp khóa mới…

Vấn đề là những dữ liệu đã khóa(mã hóa) bằng private key cũ thì không thể giải mã bằng public key mới. Mình cũng có nghĩ ra 1 hướng là dùng public key cũ còn lưu trong database để giải mã. Sau đó khóa lại bằng private key mới, nhưng nếu số lượng dữ liệu được mã hóa trước đó quá nhiều thì hướng giải quyết của mình không tối ưu lắm…mong mọi người góp ý thêm cho mình.

Tao Không Ngu. viết 03:24 ngày 01/10/2018

Hi Phong Pham.
1 Bạn sai nguyên tắc trong lưu trữ key. Không bao giờ được lưu trữ lại key riêng.
Khi bạn đã sinh 1 cập khóa cho khách hàng thì phải xóa hết hoặc chỉ dữ lại khóa công khai.
2 Trong trương hợp mất khóa riêng thì tất cả các tài liệu được ký bằng khóa đó là không còn giá trị. Thật vây nếu kẻ lấy được khóa ký vào 1 tài liệu nào đó và sau đó làm theo cách của bạn thì tự nhiên là bạn xác thực một tài liệu giả mạo.

Quy trình gồm 1 cập khóa CA để xác thực cập khóa của khách hàng là do bạn tạo.
Khóa công khai được gửi kèm tài liệu được ký. Khóa CA công khai được tích hợp trong phần mềm kiểm tra.
Thường thì các khóa có thời gian sử dụng 1 năm nếu quá hạn có 2 cách
1 Cảnh báo là khóa đã hết hạn (dựa vào ngày giờ ký CA).
2 Không xác thực.
Trong trường hợp mất khóa thì không xác nhận nữa. Buộc phải ký lại và gửi lại.

rogp10 viết 03:22 ngày 01/10/2018

Đọc kĩ lại thì ko hiểu thớt cho sign hay encrypt.

Phong Pham viết 03:22 ngày 01/10/2018

Mình cảm ơn các bạn đã giải đáp.
Cụ thể là mình dùng RSA để sinh cặp khóa cho mỗi giảng viên, làm ở mức ứng dụng demo thử nên lưu cả cặp trên database. Khi giảng viên nhập điểm cho sinh viên xong có thể khóa bảng điểm lại. Khi khóa thì nhập một mật khẩu kiểu như để lấy khóa riêng được lưu trên database. Bảng điểm giảng viên khóa xong thì không thể chỉnh sửa nhưng những người như quản trị viên có thể sửa trực tiếp trên database, vì vậy để kiểm tra tính toàn vẹn dữ liệu thì đem bảng điểm đã khóa ra giải mã so sánh với bảng điểm bị thay đổi trên database. Giờ mình muốn thêm chức năng lấy lại khóa không biết có giải pháp nào không? hay phải bỏ bảng điểm cũ

vũ xuân quân viết 03:27 ngày 01/10/2018

Thuật toán RSA chỉ tạo ra 1 cặp khóa duy nhất thôi. Mất khóa thi không thể lấy khóa khác hoặc tạo ra khóa khác để thay thế vào. Nên việc lấy lại khóa là không thể.

1 thắc mắc nữa là khi giảng viên khóa. Tức là đã mã hóa thành dữ liệu khác rồi thì làm sao 1 người khác có thể đọc được dữ liệu đó nếu không có key. Mình không hiểu chỗ này lắm

Phong Pham viết 03:29 ngày 01/10/2018

giảng viên khóa bằng khóa bí mật. khi ai muốn xem thì dùng khóa công khai của giảng viên đó để xem.

vũ xuân quân viết 03:21 ngày 01/10/2018

Trước hết mà mình chỉ học về RSA, không làm trong lĩnh vực này nên mình chỉ được ra ý kiến chủ quan thôi. Nói thật là mình chưa hiểu lắm. Giờ mình đưa ra ví dụ nhé:
Giáo viên chấm điểm cho 10 sinh viên. Khi có bảng điểm rồi. Giáo viên lấy private key để mã hóa. Sau đó gửi cho học sinh.
Học sinh sẽ dùng public key để giải mã.
Ý của bạn đúng như vậy không ?

rogp10 viết 03:17 ngày 01/10/2018

Mã hóa chỉ đạt được tính bí mật thôi. Kí mới đạt được tính không hồi (non-repudiation) và xác thực.

Mình thấy mô hình khả dĩ là ntn:

  • CSDL thì để admin phân quyền là được rồi.
  • Bạn xây dựng một PKI cho các giảng viên (hai cặp key kí và mã hóa). Tới khi làm bảng điểm thì giảng viên kí lên đó. Làm đề thì vừa kí vừa mã hóa. Không cần giữ private key.
viết 03:34 ngày 01/10/2018

cái bạn cần là chữ ký số (digital signature) chứ đâu phải mã hóa.

RSA có cặp key: public key (e,n) và private key d
Người sử dụng A lưu d bí mật, và thông bố (e,n) cho tất cả mọi người.

Nếu B muốn gửi thông điệp tới A, để cho an toàn, B mã hóa thông điệp M: B tính C = Me (mod n) rồi gửi C tới A. Bất kì ai nhận được C đều ko hiểu C chứa thông điệp gì, trừ A.
Để giải mã thông điệp, A tính M = Cd (mod n). Vì chỉ có mũ d mới ra lại thông điệp M ban đầu, nên chỉ có A là người có private key d mới giải mã được C.

đó là mã hóa thông điệp, nhưng RSA có cái bất lợi là thông điệp phải ngẫu nhiên thì mới an toàn, nên mã hóa RSA thường dùng để mã hóa key K là số ngẫu nhiên, sau đó key K này sẽ được dùng trong thuật toán mã hóa khác, vd AES.

còn cái bạn muốn là chữ ký số:

A tạo 1 thông điệp M, A muốn truyền M cho mọi người, và chứng minh M là do mình viết ra. Để chứng minh, A tính H = hash(M), với hash là 1 hàm băm nào đó, cần hash M trước vì RSA thông điệp ngẫu nhiên an toàn hơn thông điệp có ý nghĩa. Sau đó A tính S = Hd (mod n). Sau đó A gửi (M, hash, S) cho mọi người.
Mọi người ai cũng biết public key (e,n) của A, nên để xác nhận M là của A, mọi người tính: H = Se (mod n), và so sánh với hash(M). Nếu H == hash(M) thì M đúng là do A viết ra, vì chỉ có A mới có private key d tương ứng với public key (e,n).

trong chữ ký số thì thông điệp ban đầu M ko bị mã hóa, nên dù có mất private key d thì M đã được xác nhận từ trước vẫn có tính xác thực và đâu có bị mã hóa đâu mà cần giải mã…

Bài liên quan
0