2009-10-19 33 views
8

Tôi có một ứng dụng java máy khách và máy chủ cần có văn bản được mã hóa đi qua nhau. Tôi đang sử dụng mã hóa XOR để mã hóa văn bản mà tôi muốn.Chuỗi Java để trả lại chuỗi

Vấn đề là readline() không chấp nhận chuỗi đã bị XOR và sẽ chỉ khi được chấp nhận nếu nó bằng byte.

Vì vậy, tôi đã chuyển đổi văn bản thuần (chuỗi) thành mảng byte ở phía máy khách và cố chuyển đổi lại thành chuỗi ở phía máy chủ.

Đáng buồn thay, kết quả mà tôi đang tìm kiếm vẫn còn là văn bản và không phải là bản gốc mà tôi đã tìm kiếm.

Có ai biết làm thế nào để làm cho bytearrays thay đổi trở lại chuỗi ban đầu? Hoặc là có một cách tốt hơn để gửi thông qua một văn bản được mã hóa XOR thông qua hàm readline()?

Trả lời

19

Sau khi bạn đã áp dụng một cái gì đó như XOR, bạn kết thúc với dữ liệu nhị phân tùy ý - không chuỗi được mã hóa.

Cách an toàn thông thường để chuyển đổi nhị phân tùy ý thành văn bản là sử dụng base64 - không cố gắng tạo một chuỗi mới từ đó. Vì vậy, quá trình của bạn sẽ giống như sau:

  • Bắt đầu bằng văn bản thuần tuý dưới dạng chuỗi.
  • Mã hóa văn bản thuần túy bằng UTF-8, UTF-16 hoặc nội dung tương tự. Không sử dụng mã hóa mặc định nền tảng hoặc bất kỳ điều gì hạn chế như ASCII. Bây giờ bạn có một mảng byte.
  • Áp dụng mã hóa của bạn. (XOR là khá yếu, nhưng hãy để nó ở một bên.) Bạn vẫn có một mảng byte.
  • Áp dụng mã hóa base64 để nhận chuỗi.

Sau đó, khi bạn cần để giải mã ...

  • Áp dụng base64 giải mã để chuyển đổi chuỗi thành một mảng byte.
  • Áp dụng quy trình giải mã nhị phân của bạn (ví dụ: XOR một lần nữa). Bạn vẫn có một mảng byte.
  • Bây giờ giải mã mảng byte đó thành chuỗi, ví dụ: với new String(data, utf8Charset) để lấy lại chuỗi gốc.

Có nhiều thư viện cơ sở Java64 khác nhau, chẳng hạn như this class trong Apache Commons Codec. (Bạn sẽ muốn các phương thức encodeToString(byte[])decode(String).)

+0

+1. @ NewJavaProgrammer- Base64 không được mã hóa, tuy nhiên nó được mã hóa. – RichardOD

+1

@RichardOD - thực ra base64 được sản xuất bởi phương pháp @ Jon đều được mã hóa và mã hóa. –

+0

Yeah- Tôi bằng cách nào đó đã không nhìn thấy "áp dụng mã hóa của bạn" bit. Quá sớm vào buổi sáng! – RichardOD

1

Trước hết, không gọi mã hóa XORing. Nghiêm túc, CipherOutputStream và CipherInputStream có sẵn cho bạn nếu bạn cần bảo vệ dữ liệu của mình.

Cảm ơn bạn đã nối chuỗi, bạn có thể có DataOutputStream -> CipherOutputStream -> ByteArrayOutputStream. Điều này sẽ giúp bạn có được các byte được mã hóa đúng cách. Sử dụng các API ngược lại ở đầu bên kia và bạn sẽ lấy lại chuỗi của mình.

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