Better data protection for offline mobile game

I am making an offline mobile game and I am dealing with the security problem as my game has In-app purchase. So I do not want it to be cracked so easily. Of course perfect security is impossible so I just aim to prevent normal people to hack it so easily. Here are some methods I can think of:

1. Encryption of data in PlayerPref

Using plain text for data saving in PlayerPref is obviously dangerous, so my first barrier is to encrypt the data saved through PlayerPref. I use MD5CryptoServiceProveder provided by C#. And I use a string containing the deviceID so users cannot share their data to other users by simply replace the PlayerPref file.

2. Save and load sensitve data to PlayerPref

Because I have encrypted PlayerPref, simple hacking can be prevented. Then I need to protect the data before they are written to PlayerPref. The most common data is Score in a game. The score can be easily changed by memory searching if it is just a variable. It would be meaninigless to save a hacked data. So I usually save the score in realtime to PlayerPref and load it from PlayerPref everytime I need to change the score.

3. Group data into one string or add random strings

For example if I record whether the user completed level 1, 2, 3, I use 3 different variables and use PlayerPref.SetInt(“Unlock1”, 1), PlayerPref.SetInt(“Unlock2”, 1). It would be useless if the user completed 1 level, he can simply copy it for other levels. He does not even need to care about the encryption. In this way, I would use one string to record the status of all levels. Or I can add some random strings so same data will look different after encryption.

Not sure the above methods are useful (maybe some one can crack it easily? And more importantly, create a hacking tool to let other user without hacking technique to use), or anyone can think of other low cost (money I mean) methods to protect the data. And remember I am talking about offline games here, so I cannot use servers.

Thnanks for advice.