2009-09-13 42 views
15

Tôi có một ứng dụng iPhone mã hóa một NSString đầu vào bằng cách sử dụng CCCrypt (AES256) và một khóa văn bản thô. Chuỗi và khóa được gán cho phương thức mã hóa trả về một đối tượng NSData.NSData được mã hóa thành NSString trong obj-c?

Yêu cầu [mô tả dữ liệu] nơi 'dữ liệu' là dữ liệu chuỗi mã hóa cho một NSString như: "< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>" nhưng khi tôi cố gắng chuyển đổi đó để một NSString, tôi nhận được "(vô giá trị)".

Tôi cần trả lại NSString cho người dùng, có thể được sử dụng để giải mã ngược lại chuỗi gốc bằng cách sử dụng cùng một khóa văn bản thuần túy. Nếu thuộc tính 'description' của đối tượng NSData có thể trả về một chuỗi, có cách nào tôi có thể tạo ra một NSString từ đối tượng NSData mà không nhận được "(null)" không?

CẬP NHẬT: Nhờ Quinn, người đề xuất sử dụng mã hóa Base64 để tạo chuỗi bị xáo trộn. Từ những gì tôi hiểu, mã hóa Base64 không chỉ đơn giản là trao đổi các ký tự, nhưng trao đổi nhân vật phụ thuộc vào vị trí, vì vậy đó là tốt.

Mối quan tâm duy nhất của tôi là tôi muốn có thể mã hóa tin nhắn bằng 'cụm mật khẩu' và yêu cầu nhập cụm mật khẩu giống hệt khi chuỗi bị xáo trộn cần được giải mã - ai có thể đề xuất các cách để thực hiện việc này?

+0

Tôi đã cập nhật câu trả lời của mình để giải quyết vấn đề này bên dưới. Bạn đúng, Base64 không phải là một thuật toán thay thế - về cơ bản nó mở rộng 3 byte đến 4 byte, vì vậy dữ liệu được mã hóa là 1.37x lớn như đối tác không mã hóa của nó. Về cơ bản, phải mất 3 khối 8 bit và chia nhỏ thành 4 khối 6 bit, sau đó diễn giải lại từng khối như khối 8 bit, có thể dễ dàng được biểu diễn bằng ASCII. Wikipedia có nhiều chi tiết hơn. –

Trả lời

32

Trước hết, KHÔNG sử dụng -[NSData description] để tạo NSString cho các mục đích như vậy. (Tốt nhất là hãy xử lý -description làm đầu ra gỡ lỗi. Tôi xin lỗi nếu my previous answer lừa bạn, tôi chỉ đang in mô tả để chứng minh rằng NSData có thể được mã hóa và giải mã.) Thay vào đó, hãy sử dụng các phương thức -dataUsingEncoding:-initWithData:encoding: của NSString để chuyển đổi giữa NSData và NSString. Ngay cả với những điều này, lưu ý rằng dữ liệu được mã hóa AES có thể sẽ không dịch tốt thành chuỗi như - một số chuỗi byte sẽ không phát độc đáo, vì vậy bạn nên mã hóa dữ liệu trước khi tạo chuỗi.

Tôi khuyên bạn nên thử Base64 encoding NSData, vì dữ liệu Base64 luôn có thể được biểu diễn dưới dạng chuỗi ASCII. (Tất nhiên, khi bạn làm điều đó, bạn sẽ phải giải mã từ Base64 trước khi giải mã.)

Dưới đây là một số tài nguyên hữu ích ...


Edit: Tôi đã giả sử bạn muốn kết hợp này với câu trả lời của tôi để your previous question trên mã hóa AES của các đối tượng NSString. Việc mã hóa dữ liệu dưới dạng Base64 không đặt bất kỳ hạn chế nào đối với dữ liệu - nó chắc chắn có thể là dữ liệu được mã hóa bởi AES. Dưới đây là những điều cần làm gì nếu bạn chỉ muốn chuỗi đầu vào và đầu ra:

  • Encryption
    • Cung cấp NSString được mã hóa, và cụm từ mật khẩu để sử dụng cho việc mã hóa.
    • Chuyển đổi chuỗi thành NSData và thực hiện mã hóa AES trên đó (xem câu hỏi trước).
    • Mã hóa Base64 mã NSData, sau đó tạo và trả về và NSString của đầu ra được mã hóa.
  • Decryption
    • Cung cấp chuỗi mã hóa và mã hóa, và cụm từ mật khẩu để sử dụng cho giải mã.
    • Tạo một NSData từ chuỗi đầu tiên, sau đó Base64 giải mã dữ liệu.
    • Thực hiện giải mã AES trên dữ liệu, sau đó tạo và trả về một NSString.

Nó thực sự chỉ là vấn đề chaining được kết hai phần với nhau và thực hiện chúng trong ngược lại trên đường ra. Từ câu trả lời trước của tôi, bạn có thể sửa đổi encryptString:withKey: để thực hiện bước cuối cùng và trả về một chuỗi và thay đổi decryptData:withKey: thành decryptString:withKey: và chấp nhận hai chuỗi. Nó khá đơn giản.

+3

+1 và Cảm ơn bạn đã liên kết tới NSDataAdditions, rất hữu ích! –

+0

@FreeAsInBeer Vui lòng không đánh dấu câu trả lời của người khác là Community Wiki khi bạn chỉnh sửa chúng. Đó không phải là những gì nó cho. –

+0

@QuinnTaylor Câu hỏi thường gặp nói rằng bạn là người duy nhất có quyền truy cập vào hộp kiểm Community Wiki. Chỉnh sửa của tôi có thể đã vô tình khiến nó vào chế độ Community Wiki, nhưng điều đó hoàn toàn không chủ ý. Xin đừng cáo buộc những người khác làm những việc mà họ không thể làm. [Tham khảo] (http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

Tôi đã đặt cùng một nhóm danh mục hoàn chỉnh cho NSData và NSString để cung cấp mã hóa AES256 cho chuỗi.

Vui lòng xem my answer về câu hỏi 'ban đầu' để biết thêm chi tiết.

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