2009-05-14 41 views
6

Tôi đang xây dựng một ứng dụng iPhone sử dụng dịch vụ web C#. Dịch vụ web C# của tôi lấy chi tiết người dùng và xác thực đối với DB của tôi và trả về các tệp xml.Mã hóa chuỗi trong C# và Mục tiêu c

Vì vậy, bây giờ vấn đề là làm thế nào để mã hóa chi tiết người dùng (tên người dùng và mật khẩu là 10chars mỗi) trong mục tiêu c và giải mã trong C#.

Tôi rất mới về mật mã, phương pháp nào là tốt nhất. nó sẽ có thể mã hóa trong Objective c và Decrypt trong C#.

cảm ơn ..

Trả lời

0

Câu hỏi của bạn rất mơ hồ, nhưng ngắn gọn; vâng, có thể. Bạn sẽ cần phải tìm ra những gì mong đợi của mật mã của bạn là (bảo mật cao hoặc tốc độ cao?) Và sau đó cân nhắc những lợi ích của các thuật toán khác nhau và những khó khăn trong việc thực hiện trong Objective-C và C#.

5

Với giả định rằng bạn đang mã hóa thông tin này để bảo vệ nó qua mạng, giải pháp tốt nhất là kết nối qua SSL. Điều này sẽ giải quyết vấn đề mà không tạo sự phức tạp mới trong mã. Xử lý SSL thường có sẵn trong cả .NET và Cocoa.

Có một lý do nào khác khiến bạn đang cố mã hóa dữ liệu này không?

+2

SSL (trên thực tế, TLS) chắc chắn là con đường để đi. Những người hoàn toàn mới với mật mã không nên cố gắng triển khai một hệ thống mã hóa trong mã sản xuất. Nó quá dễ dàng để làm điều đó sai và kết thúc với một cảm giác an toàn sai lầm. TLS là một cách nền tảng tiêu chuẩn để mã hóa lưu lượng truy cập web và việc triển khai OS X và .NET có thể đã được xác minh bởi những người có thẩm quyền cao. – user57368

1

Sau đây là từ The CSharp Cookbook. Đó là về như là một ví dụ như tồn tại. Tất nhiên, bạn sẽ phải chuyển phần mã hóa thành Objective C, nhưng miễn là bạn sử dụng cùng một Khóa, nó sẽ tạo ra cùng một kết quả.

Bạn cần phải sử dụng Rijndael mật mã trong đó có sẵn here in ObjC compatible code

public static void EncDecString() 
     { 
      string encryptedString = CryptoString.Encrypt("MyPassword"); 
      Console.WriteLine("encryptedString: " + encryptedString); 
      // get the key and IV used so you can decrypt it later 
      byte [] key = CryptoString.Key; 
      byte [] IV = CryptoString.IV; 

      CryptoString.Key = key; 
      CryptoString.IV = IV; 
      string decryptedString = CryptoString.Decrypt(encryptedString); 
      Console.WriteLine("decryptedString: " + decryptedString); 

     } 

     public sealed class CryptoString 
     { 
      private CryptoString() {} 

      private static byte[] savedKey = null; 
      private static byte[] savedIV = null; 

      public static byte[] Key 
      { 
       get { return savedKey; } 
       set { savedKey = value; } 
      } 

      public static byte[] IV 
      { 
       get { return savedIV; } 
       set { savedIV = value; } 
      } 

      private static void RdGenerateSecretKey(RijndaelManaged rdProvider) 
      { 
       if (savedKey == null) 
       { 
        rdProvider.KeySize = 256; 
        rdProvider.GenerateKey(); 
        savedKey = rdProvider.Key; 
       } 
      } 

      private static void RdGenerateSecretInitVector(RijndaelManaged rdProvider) 
      { 
       if (savedIV == null) 
       { 
        rdProvider.GenerateIV(); 
        savedIV = rdProvider.IV; 
       } 
      } 

      public static string Encrypt(string originalStr) 
      { 
       // Encode data string to be stored in memory 
       byte[] originalStrAsBytes = Encoding.ASCII.GetBytes(originalStr); 
       byte[] originalBytes = {}; 

       // Create MemoryStream to contain output 
       MemoryStream memStream = new MemoryStream(originalStrAsBytes.Length); 

       RijndaelManaged rijndael = new RijndaelManaged(); 

       // Generate and save secret key and init vector 
       RdGenerateSecretKey(rijndael); 
       RdGenerateSecretInitVector(rijndael); 

       if (savedKey == null || savedIV == null) 
       { 
        throw (new NullReferenceException(
         "savedKey and savedIV must be non-null.")); 
       } 

       // Create encryptor, and stream objects 
       ICryptoTransform rdTransform = 
        rijndael.CreateEncryptor((byte[])savedKey.Clone(), 
              (byte[])savedIV.Clone()); 
       CryptoStream cryptoStream = new CryptoStream(memStream, rdTransform, 
        CryptoStreamMode.Write); 

       // Write encrypted data to the MemoryStream 
       cryptoStream.Write(originalStrAsBytes, 0, originalStrAsBytes.Length); 
       cryptoStream.FlushFinalBlock(); 
       originalBytes = memStream.ToArray(); 

       // Release all resources 
       memStream.Close(); 
       cryptoStream.Close(); 
       rdTransform.Dispose(); 
       rijndael.Clear(); 

       // Convert encrypted string 
       string encryptedStr = Convert.ToBase64String(originalBytes); 
       return (encryptedStr); 
      } 

      public static string Decrypt(string encryptedStr) 
      { 
       // Unconvert encrypted string 
       byte[] encryptedStrAsBytes = Convert.FromBase64String(encryptedStr); 
       byte[] initialText = new Byte[encryptedStrAsBytes.Length]; 

       RijndaelManaged rijndael = new RijndaelManaged(); 
       MemoryStream memStream = new MemoryStream(encryptedStrAsBytes); 

       if (savedKey == null || savedIV == null) 
       { 
        throw (new NullReferenceException(
         "savedKey and savedIV must be non-null.")); 
       } 

       // Create decryptor, and stream objects 
       ICryptoTransform rdTransform = 
        rijndael.CreateDecryptor((byte[])savedKey.Clone(), 
              (byte[])savedIV.Clone()); 
       CryptoStream cryptoStream = new CryptoStream(memStream, rdTransform, 
        CryptoStreamMode.Read); 

       // Read in decrypted string as a byte[] 
       cryptoStream.Read(initialText, 0, initialText.Length); 

       // Release all resources 
       memStream.Close(); 
       cryptoStream.Close(); 
       rdTransform.Dispose(); 
       rijndael.Clear(); 

       // Convert byte[] to string 
       string decryptedStr = Encoding.ASCII.GetString(initialText); 
       return (decryptedStr); 
      } 
     } 

Tôi không thể nói về việc thực hiện C Mục tiêu của Rijndael mật mã, nhưng tôi đã sử dụng này (C#) mã cho các cơ sở của một số sản công việc và nó đã làm việc tuyệt vời.

0

Tôi không biết Mục tiêu C, nhưng để giải mã C#, hãy xem xét các CryptoServiceProviders khác nhau trong System.Security.Cryptography.

Dưới đây là một ví dụ tôi đã viết bằng TripleDES:

public class TripleDES 
{ 
    private byte[] mbKey; 
    private byte[] mbIV; 
    private TripleDESCryptoServiceProvider tdProvider = new TripleDESCryptoServiceProvider(); 
    private UTF8Encoding UTEncode = new UTF8Encoding(); 

    // Key: **YOUR KEY** 
    // Project IV: **YOUR IV** 
    public TripleDES(string strKey, string strIV) 
    { 
     mbKey = UTEncode.GetBytes(strKey); 
     mbIV = UTEncode.GetBytes(strIV);   
    } 

    public TripleDES() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 


    public string EncryptToString(string strInput) 
    {   
     return Convert.ToBase64String(this.EncryptToBytes(strInput));   
    } 

    public byte[] EncryptToBytes(string strInput) 
    { 
     byte[] bInput = UTEncode.GetBytes(strInput); 
     byte[] bOutput = ProcessInput(bInput, tdProvider.CreateEncryptor(mbKey, mbIV)); 
     return bOutput; 
    } 

    public string DecryptToString(string strInput) 
    { 
     return UTEncode.GetString(DecryptToBytes(strInput)); 
    } 

    public byte[] DecryptToBytes(string strInput) 
    { 
     byte[] bInput = Convert.FromBase64String(strInput); 
     byte[] bOutput = ProcessInput(bInput, tdProvider.CreateDecryptor(mbKey, mbIV)); 
     return bOutput; 
    } 

    private byte[] ProcessInput(byte[] input, ICryptoTransform ctProcessor) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     CryptoStream crpStream = new CryptoStream(memStream, ctProcessor, CryptoStreamMode.Write); 

     crpStream.Write(input, 0, input.Length); 
     crpStream.FlushFinalBlock(); 

     memStream.Position = 0; 

     byte[] output; 
     output = new byte[memStream.Length]; 

     memStream.Read(output, 0, output.Length); 

     memStream.Close(); 
     crpStream.Close(); 

     return output; 
    } 
} 

}