it-swarm-vi.com

Có một ví dụ đơn giản về thói quen mã hóa / giải mã bất đối xứng không?

Tôi có thể hiểu mã Java, Perl và JavaScript rất tốt. Phần còn lại, tôi chưa nghiên cứu, nhưng tôi đoán tôi có thể tìm ra cách đọc/dịch.

Tôi muốn biết những gì đơn giản nhất của thói quen bất đối xứng là gì. Có thực sự quá phức tạp để muốn lo lắng?

Tôi thực sự tò mò làm thế nào có thể có một khóa chỉ mã hóa! Nó có vẻ đáng kinh ngạc với tôi rằng nó có thể chống lại kỹ thuật đảo ngược vì vậy tôi muốn biết làm thế nào nó hoạt động!

  1. Có quá phức tạp cho điều đó.
  2. (Một trong) thói quen mã hóa bất đối xứng tiêu chuẩn đơn giản nhất mà tôi có thể tìm kiếm khi thực hiện là gì?
  3. Nếu bạn xảy ra có bất kỳ ví dụ mã tối thiểu nào sẽ tốt đẹp.

Tôi đã kiểm tra các đoạn Wikipedia về Cách thức hoạt động , nhưng không có phân tích toán học hoặc mô tả về việc thực hiện, chỉ rất nhiều triển khai . Tôi không thực sự muốn chọn ngẫu nhiên cái nào để xem, tôi cũng không muốn lấy cái phổ biến nhất mà tôi mong đợi là mạnh mẽ và phức tạp nhất.

Có suy nghĩ gì không?

11
Bryan Field

Tín dụng chuyển đến câu trả lời của Jeff để biết chi tiết và câu trả lời của Steve cũng hữu ích. Tín dụng cũng đi đến câu trả lời của tylerl bao gồm các liên kết đến Wikipedia cho tất cả các chức năng, đặc biệt là modInverse , cũng làm rõ điểm bắt đầu mơ hồ cho e. Cảm ơn bạn, Tôi đã nâng cao câu trả lời của bạn và sử dụng thông tin kết hợp từ cả ba câu trả lời, tôi đã tạo ra điều tôi hy vọng là câu trả lời tốt hơn.

Chìa khóa để tạo ra kỹ thuật đảo ngược rất tốn kém là sử dụng power-of . Căn bậc hai không quá khó, sức mạnh của 3 có nghĩa là bạn cần một căn bậc hai, nhưng sức mạnh của 34.051.489 là khá khó. Có những phép toán khác rất khó để thiết kế ngược. Cũng có nhiều cách để tạo ra Thuật toán bất đối xứng, nhưng câu trả lời này tập trung vào RSA. Lâu đời nhất và phổ biến nhất.

Thuật toán RSA (dựa trên the Java Code )

Các phép tính dưới đây nên được thực hiện với số nguyên chính xác tùy ý . (Chẳng hạn như BigInt hoặc BigInteger)

Tạo các khóa:

  • Độ dài khóa không đổi là l.
  • Thông thường e_start Có thể =3 Để đơn giản. Tuy nhiên, 0x10001 Là phổ biến hơn, ở mọi mức độ, số nguyên tố là tốt nhất (vì lý do hiệu suất tạo khóa và có thể là các lý do khác).
  • pq là các số nguyên tố dương được tạo ngẫu nhiên, yêu cầu tối đa l bit để lưu trữ. (Để giữ những giá trị dương này, bit đầu tiên sẽ luôn là 0)
  • n = p*q Cái này được sử dụng cho cả mã hóa và giải mã.
  • e bắt đầu là e_start. Đây cuối cùng sẽ là một phần của khóa mã hóa.
  • m = (p-1)*(q-1) được sử dụng để chuyển đổi e thành d, sẽ được sử dụng để giải mã.
  • while(gcd(e,m)>1){e+=2} Điều này là cần thiết cho bước tiếp theo để làm việc.
  • d=modInverse(e,m) Điều này thực hiện một hoạt động arithmatic tiêu chuẩn. Có lẽ không đáng để kiểm tra nhiều, đặc biệt nếu ngôn ngữ lập trình của bạn được tích hợp sẵn

Để mã hóa hoặc giải mã, trước tiên hãy chuyển đổi byte của bạn thành một số nguyên chính xác tùy ý.

Mã hóa: encrypted=(plain^e)%n

Lưu ý: Nếu plain>=n, Bạn phải chia plain thành hai hoặc nhiều giá trị nhỏ hơn và mã hóa chúng riêng biệt.

Giải mã: plain=(encrypted^d)%n

Mã hóa bất đối xứng thường kém hiệu quả hơn mã hóa đối xứng. Đôi khi mã hóa bất đối xứng chỉ được sử dụng để trao đổi khóa.

6
Bryan Field

Theo như RSA, this cung cấp một ví dụ hay có thể theo dõi và hiển thị các ví dụ tương ứng về đầu vào và đầu ra. Ứng dụng này demo sẽ đưa bạn qua các bước khác nhau và cho phép bạn kiểm tra công việc. Đôi khi chỉ cần nhấp theo cách của bạn thông qua một cái gì đó trong các bước như vậy sẽ giúp. Đối với các bài viết Wikipedia, bạn cần xem bài viết thuật toán thực tế: RSA để biết toán học tương ứng.

Thực hiện khôn ngoan, bạn có thể kết hợp điều này rõ ràng trong Java trong dưới 30 dòng .

Theo hiểu biết của bạn, không có thứ gọi là khóa chỉ mã hóa. Thay vào đó, có hai khóa bằng nhau đảo ngược hoạt động của các đối tác của họ. Chúng tôi tùy ý chỉ định một trong các cặp là riêng tư và một là công khai. Những thứ được mã hóa bằng một khóa có thể được giải mã bằng khóa kia. Đây là nguyên tắc được sử dụng với việc ký kết.

Đây không phải là vấn đề của kỹ thuật chống đảo ngược làm cho các khóa an toàn, mà là một khái niệm toán học mà bạn không thể kiểm tra hợp lý không gian phím lớn (khi khóa sử dụng một không gian số thực sự lớn) để tìm khóa khớp. Không có tăng tốc thực sự cho công việc bao thanh toán.

Có nhiều thuật toán khóa bất đối xứng khác để tìm hiểu, nhưng khi bạn nhìn chằm chằm, tôi sẽ thử hiểu RSA, lần đầu tiên và phổ biến nhất, trước tiên.

13
Jeff Ferland

Tôi tập hợp một bản trình diễn RSA bằng cách sử dụng python (python rất dễ đọc ngay cả khi bạn chưa bao giờ nhìn thấy nó trước đây). Mã này đủ dài để nó không phù hợp với một trang, nhưng đủ ngắn để bạn có thể đọc và hiểu nó trong vài phút.

Vì mã hóa/giải mã có thể được thực hiện trong một lệnh tích hợp duy nhất - exp(PLAINTEXT,KEY,MODULUS) - Tôi cũng trải qua toàn bộ quá trình phái sinh chính.

Bạn sẽ tìm thấy mã ở đây: https://Gist.github.com/1239116

Khi bạn chạy mã, nó sẽ yêu cầu bạn nhập dữ liệu dưới dạng >12345 hoặc là <12345, trong đó > tiền tố bảo nó áp dụng khóa riêng cho số, trong khi < bảo nó áp dụng khóa chung. Vì lợi ích của sự đơn giản, nó chỉ mã hóa số; nhưng một khi bạn có điều đó, mã hóa dữ liệu tùy ý chỉ là vấn đề định dạng.

6
tylerl

Trên thực tế, toán học xung quanh nó khá đơn giản, như tôi hiểu. Bạn lấy một giá trị với sức mạnh của một số nguyên tố lớn được quy định lại (hàng ngàn chữ số) và thực hiện một mod từ một số khác.

Vì vậy, để mã hóa, bạn có một cái gì đó như: EncryptedBits = (PlainText ^ YourPublicKey)% Modulus

Và để giải mã bạn có một cái gì đó như: PlainText = (EncryptedBits ^ YourPrivateKey)% Modulus

Tôi đã bắt gặp một tài liệu khá dễ đọc trên đây: http://mathkn.org/mam/06/Kaliski.pdf

Tôi không chắc chắn về bất kỳ thư viện để xem xét mặc dù.

5
Steve

Nếu bạn muốn một giải pháp Perl dễ thương, tối thiểu, có một giải pháp cổ điển của Adam Back từ 1995 :

Nó được in trên áo phông, bao gồm mã vạch để có thể đọc được trên máy tính, cùng với tuyên bố " Chiếc áo phông này là một Munition " . Tuyên bố đó là chính xác ở Mỹ trước khi mật mã mạnh là được phân loại lại vào năm 1996 để không còn là một "đạn dược". Nhưng vẫn còn bất hợp pháp khi xuất khẩu mật mã mạnh từ Hoa Kỳ cho đến khi Quy định quản lý xuất khẩu (EAR) là sửa đổi năm 20 :

Phần mềm cũng đã được phân phối dưới dạng hình xăm, chữ ký email, nhãn thư và trong nhiều hình thức khác, và thậm chí xuất hiện (ở dạng mờ) trong Thời báo New York (bài báo, không có ảnh, đang trực tuyến tại Giữa một Hacker và một nơi khó khăn ). Phiên bản 2 dòng gần đây hơn là:

print pack"C*",split/\D+/,`echo "16iII*o\[email protected]{$/=$z;[(pop,pop,unpack"H*",<>
)]}\EsMsKsN0[lN*1lK[d2%Sa2/d0<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<J]dsJxp"|dc`

Lưu ý rằng cách tiếp cận ban đầu dựa trên chương trình "dc" Unix cho số học chính xác tùy ý. Một phiên bản thuần túy Perl, với chú thích, là tại

2
nealmcb