如何在c#中加密文件并在android和IOS上解密

时间:2015-12-14 10:48:26

标签: android ios asp.net encryption

我需要创建加密数据的文件。我在asp.net app上创建加密数据。

现在我需要在Android应用程序和IOS应用程序上读取文件并解密数据。

我可以使用哪种类型的加密,它将为所有类型的客户端提供库?

用于编码我使用此代码

public static string Encrypt(string plainText, string passPhrase)
    {
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null))
        {
            byte[] keyBytes = password.GetBytes(keysize / 8);
            using (RijndaelManaged symmetricKey = new RijndaelManaged())
            {
                symmetricKey.Mode = CipherMode.CBC;
                using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes))
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                        {
                            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                            cryptoStream.FlushFinalBlock();
                            byte[] cipherTextBytes = memoryStream.ToArray();
                            return Convert.ToBase64String(cipherTextBytes);
                        }
                    }
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

鉴于加密知识水平,最好的办法是使用RNCryptor。它适用于多种语言,包括Objective-C和C#。

RNCryptor处理成功安全加密所需的所有详细信息,例如密钥派生,身份验证和版本控制。对于那些不熟悉使用加密的人来说,这一切都是正确的。

保护密钥仍然是一个难题。使用钥匙串存储密钥是最佳做法。问题是如何在应用程序和服务器之间共享密钥,如果它被编译到应用程序中,这是一个几乎无法克服的主要弱点。

答案 1 :(得分:2)

对于交叉加密和解密,您可以使用XOR.Its非常简单。

对于IOS来说

+(NSString *) EncryptOrDecrypt:(NSString *)string {

NSString *key=@"Your_Key";

// Create data object from the string
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

// Get pointer to data to obfuscate
char *dataPtr = (char *) [data bytes];

// Get pointer to key data
char *keyData = (char *) [[key dataUsingEncoding:NSUTF8StringEncoding] bytes];

// Points to each char in sequence in the key
char *keyPtr = keyData;
int keyIndex = 0;

// For each character in data, xor with current value in key
for (int x = 0; x < [data length]; x++)
{
    // Replace current character in data with
    // current character xor'd with current key value.
    // Bump each pointer to the next character
    *dataPtr = *dataPtr ^ *keyPtr;
    dataPtr++;
    keyPtr++;

    // If at end of key data, reset count and
    // set key pointer back to start of key value
    if (++keyIndex == [key length])
        keyIndex = 0, keyPtr = keyData;
}

return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

对于Android:

public static String EncryptOrDecrypt(String input) {
    char[] key = {'K', 'E', 'Y'}; //Your key in char array
    StringBuilder output = new StringBuilder();

    for(int i = 0; i < input.length(); i++) {
        output.append((char) (input.charAt(i) ^ key[i % key.length]));
    }

    return output.toString();
}

对于C#:

string EncryptOrDecrypt(string text, string key)//Your Key as parameter
{
var result = new StringBuilder();

for (int c = 0; c < text.Length; c++)
    result.Append((char)((uint)text[c] ^ (uint)key[c % key.Length]));

return result.ToString();

}

使用相同的功能进行加密和解密。您必须使用相同的密钥进行加密和解密。

答案 2 :(得分:1)

看一下这个框架https://github.com/RNCryptor/RNCryptor - 它提供了一种跨平台的加密/解密方式。