2013-02-20 32 views
6

Gần đây tôi đã bắt đầu chơi xung quanh với C#, và tôi đang cố gắng hiểu tại sao mã sau đây không biên dịch. Trên dòng có nhận xét lỗi, tôi nhận được:XOR-ing chuỗi trong C#

Không thể chuyển đổi rõ ràng loại 'int' sang 'char'. Một lần thoát chuyển đổi rõ ràng (bạn có bỏ lỡ một dàn diễn viên không?)

Tôi đang cố gắng thực hiện thao tác XOR đơn giản với hai chuỗi.

public string calcXor (string a, string b) 
{ 
    char[] charAArray = a.ToCharArray(); 
    char[] charBArray = b.ToCharArray(); 
    char[] result = new char[6]; 
    int len = 0; 

    // Set length to be the length of the shorter string 
    if (a.Length > b.Length) 
     len = b.Length - 1; 
    else 
     len = a.Length - 1; 

    for (int i = 0; i < len; i++) { 
     result[i] = charAArray[i]^charBArray[i]; // Error here 
    } 

    return new string (result); 
} 
+2

Nếu chuỗi của bạn là ASCII, hãy thử 'kết quả [i] = (char) (ngắn) charAArray [i]^(ngắn) charBArray [i]); ' – ebattulga

+3

Các toán tử bitwise chỉ lấy số làm toán hạng. Chuỗi của bạn có phải là một chuỗi các chữ số không? Hay bạn đang cố thực hiện thao tác này dựa trên Giá trị ASCII? – JohnFx

+1

Cảm ơn, tôi quên rằng xor là toán tử bitwise vì vậy phải mất 1 và 0 đó là lý do tại sao nó phàn nàn về chuyển đổi int. –

Trả lời

4

Bạn đang thực hiện xor trên 2 ký tự. Điều này sẽ thực hiện chuyển đổi loại ẩn thành int cho bạn vì không mất dữ liệu. Tuy nhiên, chuyển đổi từ int sang char sẽ cần bạn cung cấp một dàn diễn viên rõ ràng.

Bạn cần phải chuyển đổi một cách rõ ràng của bạn int đến một char cho result[i]:

result[i] = (char) (charAArray[i]^charBArray[i]); 
+0

đã nhận được, cảm ơn bạn! –

13

Nếu bạn sử dụng XOR-ing để ẩn dữ liệu, hãy nhìn vào mã bên dưới. Chìa khóa sẽ được lặp lại miễn là cần thiết. Đó có thể là cách tiếp cận ngắn hơn/tốt hơn:

public static string xorIt(string key, string input) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for(int i=0; i < input.Length; i++) 
     sb.Append((char)(input[i]^key[(i % key.Length)])); 
    String result = sb.ToString(); 

    return result; 
} 
+0

+1 cho mã. Nhưng sử dụng bất kỳ Mã hóa Dòng nào không có PRG thích hợp (Trình tạo ngẫu nhiên giả) sẽ phá vỡ nguyên tắc bảo mật ngữ nghĩa. Và tôi xin lỗi để nói điều này nhưng trong mã của bạn, PRG được sử dụng là cực kỳ xa trông ngẫu nhiên và hoàn toàn có thể dự đoán được. Trong thực tế, điều này có thể bị phá vỡ với một bản mã chỉ tấn công trong một khoảng thời gian rất ngắn. Vì vậy, trong ngắn hạn không bao giờ EVER SỬ DỤNG loại mã hóa, trừ khi bạn sử dụng nó cùng với một PRP an toàn (Pseudo Random Permutation) hoặc bất kỳ loại khác của một mật mã an toàn đáng tin cậy. –

+0

Tôi hoàn toàn đồng ý. Nếu bạn muốn một giải pháp an toàn, hãy sử dụng các công cụ và khung công tác có sẵn. Họ sẽ thực hiện công việc theo đúng cách cho bạn với PRG đã đề cập và tất cả các chuông và còi đẹp khác. –

+2

IMHO, điểm của chuỗi XOR-ing không phải là bảo mật mạnh mẽ, mà là một bước trong 'obfuscation' - làm cho nó hoạt động tốt hơn cho một người nào đó đảo ngược mã của bạn để hiểu công việc của ứng dụng của bạn đang hoạt động ở đâu. Cụ thể, họ không thể đơn giản tìm kiếm chuỗi của bạn. Họ phải theo dõi logic, tìm phương pháp XOR, và nạp tất cả các chuỗi thông qua phương thức đó, với các khóa thích hợp. – ToolmakerSteve

0

Nếu giá trị của kết quả là quan trọng thì Allan là chính xác (câu trả lời được chấp nhận). Nếu bạn chỉ tìm kiếm một kết quả phù hợp và không lo lắng về hiệu suất, hãy sử dụng strcmp() hoặc memcmp() làm phương án thay thế.

Trong trình lắp ráp, việc khởi tạo mọi thứ bằng một XOR đối với bản thân là điều phổ biến khi các chu trình T ít hơn. Nếu tôi là brute-buộc (băm so sánh), sau đó điều này sẽ là một cải tiến trên strcmp hoặc memcmp như tôi thực sự không sắp xếp thứ tự, chỉ cần phù hợp/nomatch.

Người đọc cũng nên biết về this có thể được tinh chỉnh.

+0

IMHO, câu trả lời này không liên quan đến câu hỏi này, mà không nói gì về việc tìm kiếm một trận đấu. – ToolmakerSteve

+0

Tôi sẽ trả tiền đó. Tôi đọc quá nhiều vào mã. Khi xor-ing chuỗi tôi thường mong đợi để pad chuỗi ngắn hơn với hàng đầu x'00 '. Thay vào đó, sự tiến bộ từ LHS đã khiến tôi tin rằng một trận đấu đang được tìm kiếm hoặc một sự biến đổi đang xảy ra để che khuất dữ liệu. – mckenzm