10

Sau khi tôi đã đọc các bài viết về các phương pháp Mật mã (Đối xứng và Không đối xứng). Nhiều bài viết nói rằng Khóa riêng được sử dụng để mã hóa và giải mã dữ liệu. Khoá công khai được sử dụng để mã hóa dữ liệu.But Khi nào Tôi cố gắng để bắt đầu thực hiện trong Java Tôi không thể sử dụng khóa riêng để mã hóa và giải mã dữ liệu (Tôi đang sử dụng thuật toán RSA)? Nếu có thể, vui lòng cung cấp cho tôi liên kết .Nếu nó không hỗ trợ, vui lòng trả lời tại sao nó không hỗ trợ?Mã hóa và giải mã bằng khóa riêng trong Java

// Mã hóa

Cipher encrypt=Cipher.getInstance("RSA"); 
encrypt.init(Cipher.ENCRYPT_MODE, privatekey); 
byte[] encryptedMessage=encrypt.doFinal(msg.getBytes()); 

// Decrypt

Cipher decrypt=Cipher.getInstance("RSA"); 
decrypt.init(Cipher.DECRYPT_MODE, privateKey); 
byte[] decryptedMessage=decrypt.doFinal(encryptedMessage); 

Trả lời

4

Làm thế nào công tư Encryption Key đang làm việc:

  1. NẾU bạn mã hóa một cái gì đó với bất cứ ai khóa riêng của bạn với của bạn khóa công khai có thể giải mã nó.
  2. Nếu bạn mã hóa nội dung nào đó bằng khóa công cộng, chỉ khóa riêng của bạn mới có thể giải mã nó.

Bạn phải tạo cặp khóa riêng tư công khai. Khóa riêng tư chỉ dành cho bạn và khóa công khai có thể được trao cho những người bạn tin tưởng.

Cách tạo cặp khóa?

$ openssl genrsa -out private_key.pem 1024 
$ openssl rsa -pubout -in private_key.pem -out public_key.pem 

Hoặc đi đây trong làm điều đó trong java ->JAVA RSA Khi bạn làm điều đó trở lại và đặt thêm câu hỏi

-3

chìa khóa đối xứng có một phím duy nhất được sử dụng để mã hóa và giải mã cả hai. Đây là khóa bí mật đôi khi còn được gọi là khóa riêng giữa người gửi và người nhận

Mật mã khóa công khai có 2 khóa, riêng tư và công khai Nếu bạn mã hóa với một u có thể giải mã với người khác. -Nếu bạn sử dụng khóa riêng để mã hóa tin nhắn thì bất kỳ ai cũng có thể giải mã nó bằng khóa công cộng của bạn. Đây là trường hợp bạn xác thực tài liệu của mình và người khác đang xác minh rằng bằng cách sử dụng khóa công khai -Nếu bạn cần gửi tin nhắn được mã hóa cho ai đó thì bạn phải gửi tin nhắn bằng khóa công khai của mình. Trong trường hợp này, thư có thể được giải mã chỉ bằng khóa riêng mà chỉ có ai đó có. Vì vậy, trong mật mã khóa công khai RSA nơi bạn có 1 khóa công khai và 1 khóa riêng và u cần mã hóa bằng một và giải mã với mã khác trong khi mã hóa đối xứng AES,DES bạn chỉ có 1 khóa riêng bí mật được sử dụng để mã hóa và giải mã cả hai .

13

Để thực hiện mã hóa RSA, bạn cần mã hóa bằng khóa công cộng và giải mã bằng khóa riêng. Hơn nữa, bạn nên sử dụng phương pháp đệm được xác định rõ, chẳng hạn như đệm tương thích PKCS # 1 v1.5 hoặc - nếu có - đệm OAEP.

Mã hóa bằng khóa riêng RSA không có ý nghĩa, vì bất kỳ ai có khóa công khai đều có thể giải mã. Có một cái gì đó gọi là "nguyên RSA" đó là cơ bản lũy thừa mô-đun, nhưng đó chỉ nên được sử dụng với một sơ đồ đệm để tạo chữ ký. Trong trường hợp đó, bạn muốn mọi người có khóa công khai để "giải mã" để xác minh chữ ký.

Thông tin thêm herehere.

Vì vậy, mã hóa là:

// specify mode and padding instead of relying on defaults (use OAEP if available!) 
Cipher encrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
// init with the *public key*! 
encrypt.init(Cipher.ENCRYPT_MODE, publicKey); 
// encrypt with known character encoding, you should probably use hybrid cryptography instead 
byte[] encryptedMessage = encrypt.doFinal(msg.getBytes(StandardCharsets.UTF_8)); 

và giải mã là:

Cipher decrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
decrypt.init(Cipher.DECRYPT_MODE, privateKey); 
String decryptedMessage = new String(decrypt.doFinal(encryptedMessage), StandardCharsets.UTF_8); 
+0

Không phải là mã hóa ký mật mã với khóa bí mật? –

+2

@PeterBecker Tốt hơn là không nên nghĩ về nó theo cách đó. Kiểm tra [RFC 3447 phần 5.2] (http://tools.ietf.org/html/rfc3447#page-12): "... Hoạt động toán học chính trong mỗi nguyên thủy là lũy thừa, như trong mã hóa và giải mã nguyên thủy của Phần 5.1 RSASP1 và RSAVP1 giống với RSADP và RSAEP ngoại trừ tên của các đối số đầu vào và đầu ra của chúng; chúng được phân biệt vì chúng được dùng cho các mục đích khác nhau. ". Điều này chỉ đúng đối với "sách giáo khoa" hoặc RSA "thô", không phù hợp với mục đích mã hóa thông thường. Padding là một phần không thể tách rời của lược đồ và khác nhau. –

+0

Điểm chụp. Tôi thực sự đã tìm thấy một chương trình mã hóa bị hỏng khi đã sử dụng RSA thuần túy (vấn đề một) và hai phím đã được sử dụng sai cách. Lâu đài Bouncy cho phép bạn làm điều đó và sau đó lặng lẽ thay đổi padding, mà trong trường hợp này có nghĩa là không có ngẫu nhiên trên mã hóa. –

Các vấn đề liên quan