2012-11-21 107 views
12

Tôi đang cố triển khai PKI. Tôi muốn mã hóa chuỗi lớn bằng cách sử dụng RSA trong java mà không cần sử dụng lâu đài bouncy. Vấn đề tôi nhận được là dữ liệu không được dài hơn 117 byte. Tôi đã cố gắng tìm kiếm giải pháp mà tôi đã thất bại. Tôi là người mới trong mã hóa này. Xin hãy giúp tôi bằng cách đưa ra một chuỗi lớn làm ví dụ và giải thích nó.Mã hóa và giải mã chuỗi lớn trong java bằng cách sử dụng RSA

+2

Bảo mật và đặc biệt là mật mã, là ** cứng **. Bạn nên sử dụng các gói cao cấp hiện tại thay vì các API mã hóa thô hoặc tìm hiểu chi tiết về cách chúng hoạt động. Nếu không, bạn có khả năng viết mã không an toàn. – SLaks

+1

gói cao cấp có nghĩa là gì? –

+1

vui lòng đăng mã của bạn. chúng ta có thể làm việc từ đó. – Frank

Trả lời

25

Bạn không thể sử dụng giải mã mã hóa RSA trên hơn 128 byte tại một thời điểm. Bạn phải chia nhỏ dữ liệu và làm điều đó trong một vòng lặp khá nhiều bằng văn bản các byte để String/Array như bạn đi. Nếu vấn đề duy nhất của bạn là kích thước của dữ liệu, có thể bạn không còn nhiều thứ để đi nữa. Chỉ cần tách dữ liệu.

Một ví dụ tuyệt vời, có thể đầy đủ hơn cho bạn, đối phó với chuỗi lớn hơn 128 byte: http://coding.westreicher.org/?p=23

Nếu bạn cần giải thích thêm về mã hóa RSA nói chung:

Đoạn mã dưới đây trình bày cách sử dụng KeyPairGenerator để tạo cặp khóa RSA trong Java:

// Get an instance of the RSA key generator 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
// Generate the keys — might take sometime on slow computers 
KeyPair myPair = kpg.generateKeyPair(); 

Điều này sẽ cung cấp cho bạn đối tượng KeyPair, chứa hai khóa: riêng và một công cụ ic. Để sử dụng các khóa này, bạn sẽ cần phải tạo một đối tượng Cipher, nó sẽ được sử dụng kết hợp với SealedObject để mã hóa dữ liệu mà bạn sẽ kết thúc qua mạng. Dưới đây là cách bạn thực hiện điều đó:

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher c = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key 
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

Sau khi khởi tạo Mật mã, chúng tôi sẵn sàng mã hóa dữ liệu. Kể từ sau khi mã hóa dữ liệu kết quả sẽ không có ý nghĩa nhiều nếu bạn nhìn thấy chúng "trần truồng", chúng ta phải đóng gói chúng trong một đối tượng khác. Java cung cấp điều này, bởi lớp SealedObject. SealedObjects là các thùng chứa cho các đối tượng được mã hóa, mã hóa và giải mã nội dung của chúng với sự trợ giúp của một đối tượng Cipher.

Ví dụ sau đây cho thấy làm thế nào để tạo ra và mã hóa các nội dung của một SealedObject:

// Create a secret message 
String myMessage = new String("Secret Message"); 
// Encrypt that message using a new SealedObject and the Cipher we created before 
SealedObject myEncryptedMessage= new SealedObject(myMessage, c); 

Đối tượng kết quả có thể được gửi qua mạng mà không sợ, vì nó được mã hóa. Người duy nhất có thể giải mã và lấy dữ liệu, là người giữ khóa riêng. Thông thường, đây phải là máy chủ. Để giải mã thư, chúng tôi cần phải khởi tạo lại đối tượng Mật mã, nhưng lần này với một chế độ khác, giải mã và sử dụng khóa riêng thay vì khóa công cộng.

Đây là cách bạn làm điều này trong Java:

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher dec = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key 
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate()); 

Bây giờ Cipher đã sẵn sàng để giải mã, chúng ta phải nói với SealedObject để giải mã dữ liệu được tổ chức.

// Tell the SealedObject we created before to decrypt the data and return it 
String message = (String) myEncryptedMessage.getObject(dec); 
System.out.println("foo = "+message); 

Cẩn thận khi sử dụng phương pháp getObject, vì nó sẽ trả về một thể hiện của một đối tượng (thậm chí nếu nó thực sự là một thể hiện của String), và không phải là một thể hiện của lớp đó là trước khi mã hóa, vì vậy bạn' sẽ phải truyền nó tới biểu mẫu trước của nó.

Ở trên là từ: http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

6

RSA không dành cho mã hóa dữ liệu hàng loạt. Thay vào đó, hãy sử dụng mật mã đối xứng, như AES, để mã hóa "chuỗi lớn" của bạn. Sau đó, mã hóa khóa đối xứng được sử dụng cho AES bằng khóa RSA.

BouncyCastle hỗ trợ hai giao thức để thực hiện việc này: S/MIME và PGP. Tất cả các giao thức bảo mật hợp lý đều sử dụng các thuật toán không đối xứng để vận chuyển khóa hoặc trao đổi khóa theo cách này.

Kích thước thư có thể được mã hóa bằng RSA tùy thuộc vào mô đun của khóa, ít hơn một số byte cần thiết để đệm an toàn thư.

+0

Mã hóa lai như thế này là con đường để đi. – CodesInChaos

+14

Ví dụ về mã hoặc liên kết đến API có liên quan sẽ không bị ảnh hưởng. – CodesInChaos

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