Search Unity

Question CryptographicException: Bad PKCS7 padding

Discussion in 'Editor & General Support' started by modernator24, Mar 26, 2023.

  1. modernator24

    modernator24

    Joined:
    Apr 7, 2017
    Posts:
    202
    I'm using Unity 2019.4.3f1. I noticed that sometimes the game doesn't launch properly, and figured out, there is an error message like this:

    Code (text):
    1. CryptographicException: Bad PKCS7 padding. Invalid length 206.
    2. Mono.Security.Cryptography.SymmetricTransform.ThrowBadPaddingException (System.Security.Cryptography.PaddingMode padding, System.Int32 length, System.Int32 position) (at <fb001e01371b4adca20013e0ac763896>:0)
    3. Mono.Security.Cryptography.SymmetricTransform.FinalDecrypt (System.Byte[] inputBuffer, System.Int32 inputOffset, System.Int32 inputCount) (at <fb001e01371b4adca20013e0ac763896>:0)
    4. Mono.Security.Cryptography.SymmetricTransform.TransformFinalBlock (System.Byte[] inputBuffer, System.Int32 inputOffset, System.Int32 inputCount) (at <fb001e01371b4adca20013e0ac763896>:0)
    Here's the code I'm using:
    Code (CSharp):
    1. using System;
    2. using System.Text;
    3. using System.Security.Cryptography;
    4.  
    5. public class Encryptor {
    6.     public static string hash = "my_game_hash";
    7.  
    8.     public static string Encrypt(string input) {
    9.         byte[] data = ASCIIEncoding.ASCII.GetBytes(input);
    10.  
    11.         using(MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) {
    12.             byte[] key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(hash));
    13.  
    14.             using(TripleDESCryptoServiceProvider trip = new TripleDESCryptoServiceProvider() { Key = key, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }) {
    15.                 ICryptoTransform tr = trip.CreateEncryptor();
    16.                 byte[] result = tr.TransformFinalBlock(data, 0, data.Length);
    17.  
    18.                 return Convert.ToBase64String(result, 0, result.Length);
    19.             }
    20.         }
    21.     }
    22.  
    23.     public static string Decrypt(string input) {
    24.         byte[] data = Convert.FromBase64String(input);
    25.  
    26.         using(MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) {
    27.             byte[] key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(hash));
    28.  
    29.             using(TripleDESCryptoServiceProvider trip = new TripleDESCryptoServiceProvider() { Key = key, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }) {
    30.                 ICryptoTransform tr = trip.CreateDecryptor();
    31.                 byte[] result = tr.TransformFinalBlock(data, 0, data.Length);
    32.  
    33.                 return ASCIIEncoding.ASCII.GetString(result);
    34.             }
    35.         }
    36.     }
    37. }
    In the "Decrypt" method, there is a code tr.TransformFinalBlock and that's the point where the exception was thrown.

    It works fine in most cases, but sometimes, it throws "CryptographicException". So I tried to put what was the input string and it was "wD2GALrTB8qnFvvmloZigA==".

    Replacing the string input of the Decrypt method to "wD2GALrTB8qnFvvmloZigA==" will throw CryptographicException.

    Why does it throw this exception? Some people facing a similar issue and couldn't able to play the game.
     
  2. chemicalcrux

    chemicalcrux

    Joined:
    Mar 16, 2017
    Posts:
    720
    Ignoring the fact that MD5 and Triple-DES (in ECB mode!!!) are extremely obsolete...

    PKCS7 padding adds n copies of a byte with a value of n to make the plaintext size a multiple of the block size.

    So, to pad 8-byte blocks, it can do:

    XXXXXXX1
    XXXXXX22
    XXXXX333
    ...
    XXXXXXXX88888888

    If the plaintext is already an even multiple, then it will add an entire block of padding: 8 bytes, in this case, since you're using Triple-DES (which has a block size of 8 bytes). This is mandatory so that it's always unambiguous what is padding and what is not.

    TransformFinalBlock will encrypt one or more blocks (at least for AES; maybe it doesn't for Triple-DES!), including correctly padding the last block. So, that sounds fine.

    Your "bad" ciphertext has a length of 16 bytes after decoding from base64. So, your plaintext was 8 bytes long, and it also appended 8 bytes of padding, giving you a total of 16 bytes.

    If the last 8 bytes aren't all 0x08, you'll get an error, since that is not valid padding.

    That by itself is reasonable...although I am unable to decrypt that ciphertext correctly. Is "my_game_hash" not the actual string you're MD5'ing to generate the 128-bit key?

    So, shortlist of questions:
    • Is "my_game_hash" the actual string you're using?
    • How long is the string that you're encrypting?
    • Can you show a good plaintext-ciphertext pair and a broken plaintext-ciphertext pair?
     
  3. modernator24

    modernator24

    Joined:
    Apr 7, 2017
    Posts:
    202
    Sorry, I forgot to mention, that "my_game_hash" is not the actual string I'm using, I just replaced something else when I copied and pasted the code here. Is it okay to reveal my hash string publicly here? Wouldn't be a security problem?

    I'm not sure, but it's stringified JSON so probably would be very long. But possibly can be short if the data doesn't contain anything.

    Well actually I'm not the one who made this code, I just find this source code on YouTube so not much is known about encryption. What's the ciphertext pair, could you explain it to me?
     
  4. modernator24

    modernator24

    Joined:
    Apr 7, 2017
    Posts:
    202
    actually there's another string that causes the same error message:

    Code (text):
    1. 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
    This probably encrypted game data.
     
  5. chemicalcrux

    chemicalcrux

    Joined:
    Mar 16, 2017
    Posts:
    720
    I think we need back up and ask what you're using this cryptography for. Are you trying to prevent users from accessing certain parts of your game?

    If so, then this isn't going to achieve anything: you're including the string that the key is derived from in the game! Anyone can just look at the string, derive the key from it, and decrypt the data.

    Also, I would not call this a "hash string" -- it is just a string that you use to produce a key.

    Anyway, I asked because this would make it easy for me to check the validity of your ciphertexts. You can always just make up a new random string afterwards (but, again, I think I need to hear more about what you're doing here!)

    I asked because it looks like you only encrypted 8 bytes of data. That's exactly one Triple-DES block, which sounded unusual to me. It implied that something was going wrong, truncating either the plaintext or the ciphertext and giving you invalid data.

    But, given the most recent post, it sounds like you are encrypting quite a bit of data at once.

    "Plaintext" is the unencrypted data. "Ciphertext" is the result of encrypting the plaintext.

    So, you might wind up with...

    Plaintext: "Hello!"
    Ciphertext: [8 bytes worth of base64]

    Plaintext: "Hello world!"
    Ciphertext: [16 bytes worth of base64]
     
  6. modernator24

    modernator24

    Joined:
    Apr 7, 2017
    Posts:
    202
    Okay my key string is "stickwarfare-aow-is-awesome".

    Plaintext would be just stringified JSON cause I'm using like this:
    Code (CSharp):
    1. public void Save() {    
    2.     string serializedData = Encryptor.Encrypt(JsonUtility.ToJson(m_SavedData));
    3.  
    4.     StreamWriter writeStream = File.CreateText(m_FilePath);
    5.     writeStream.WriteLine(serializedData);
    6.     writeStream.Close();
    7. }
    8.  
    9. public void Load() {
    10.     StreamReader readStream = File.OpenText(m_FilePath);
    11.     StringBuilder readSb = new StringBuilder();
    12.     string line;
    13.  
    14.     do {
    15.         line = readStream.ReadLine();
    16.  
    17.         if (line == null) {
    18.             break;
    19.         }
    20.  
    21.         readSb.Append(line);
    22.     } while(true);
    23.  
    24.     string serializedData = readSb.ToString();
    25.     m_SavedData = JsonUtility.FromJson<PlayerData>(Encryptor.Decrypt(serializedData));
    26.  
    27.     readStream.Close();
    28. }
     
  7. chemicalcrux

    chemicalcrux

    Joined:
    Mar 16, 2017
    Posts:
    720
    Hm, I still can't get a meaningful decryption out of any of the ciphertexts you've posted so far.

    The MD5 of "stickwarfare-aow-is-awesome" is
    ec5f018bde03b5aaacba48472bedea58
    . If I use that to decrypt the short ciphertext you included in the original post, I get garbage:

    upload_2023-3-27_8-24-55.png

    Can you provide an example of a ciphertext that does not cause an exception?

    Since this is for save data, I wonder if you have old data that was encrypted under a different key. That would certainly explain the problem (although it wouldn't make sense for it to be occasionally happening when you're testing the game).
     
  8. modernator24

    modernator24

    Joined:
    Apr 7, 2017
    Posts:
    202
    No, it's not. I always used the same key. It just happens randomly so I don't know why this is happening.

    Proper ciphertext may look like this:

    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

    Which will give me this stringified JSON

    {"WatchCashAds":0,"WatchRewardIncreaseAds":0,"IAPSmallCashPackPurchased":0,"IAPMediumCashPackPurchased":0,"IAPLargeCashPackPurchased":0,"IAPHugeCashPackPurchased":0,"IAPMegaCashPackPurchased":0,"Cash":0,"Gold":0,"SpentCash":0,"SpentGold":0,"ChapterProgresses":[{"Chapter":0,"Locked":false,"MissionProgresses":[{"MissionId":0,"Locked":false,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":1,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":2,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":3,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":4,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":5,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":6,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]},{"Chapter":7,"Locked":true,"MissionProgresses":[{"MissionId":0,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":1,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":2,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":3,"Locked":true,"Cleared":false,"Rank":0},{"MissionId":4,"Locked":true,"Cleared":false,"Rank":0}]}],"ClearedDailyMissions":[],"RewardedDailyMissions":[],"DailyKillCount":0,"DailyWatchAdsCount":0,"DailyPlayCount":0,"MissionExpireTime":"","OnDailyMissionReset":{"m_PersistentCalls":{"m_Calls":[]}},"PlayerType":0,"AskedStoreReview":false,"StoreReviewed":false,"Cheated":false,"CheatDetails":{"Speedhack":0},"LoginID":"","RegisteredUserID":"","RegisteredUserEmail":"","UsedPromotionCodes":[],"Squads":[{"Units":[1,2]},{"Units":[1,2]},{"Units":[1,2]},{"Units":[1,2]}],"DefaultSquadIndex":0,"HasSecondSquadSlot":false,"HasThirdSquadSlot":false,"HasFourthSquadSlot":false,"TotalGameLaunched":11,"FirstLaunchedTime":"2023-03-26 AM 3:51:02","TotalMatchPlayed":0,"TotalSpentMateriel":0,"TotalKills":0,"TotalMultiplayerPlayed":0,"TotalPvPVictory":0,"TotalCoopVictory":0,"Units":[{"Unit":1,"Owned":true,"Tier":0,"Upgrades":[]},{"Unit":2,"Owned":true,"Tier":0,"Upgrades":[]},{"Unit":9,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":3,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":5,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":4,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":6,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":7,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":16,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":8,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":15,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":10,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":14,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":12,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":13,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":11,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":17,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":18,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":100,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":107,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":108,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":101,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":106,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":102,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":104,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":105,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":103,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":150,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":152,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":200,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":201,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":202,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":206,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":205,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":203,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":204,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":300,"Owned":true,"Tier":0,"Upgrades":[]},{"Unit":301,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":305,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":303,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":302,"Owned":false,"Tier":0,"Upgrades":[]},{"Unit":304,"Owned":false,"Tier":0,"Upgrades":[]}],"Upgrades":[],"WroteReview":false,"TutorialPlayed":false,"TotalPlayTime":70.57160782814026,"LastUpdatedTime":"-8585216740243387765","Level":0,"Tier":0,"XP":0}
     
  9. chemicalcrux

    chemicalcrux

    Joined:
    Mar 16, 2017
    Posts:
    720
    Okay, yeah, that decrypted just fine! So, you're somehow getting bogus ciphertexts.

    I wonder if you are not correctly handling the case when the plaintext is a multiple of 8 bytes. That winds up giving you back eight extra bytes of ciphertext, since there's an entire block of padding at the end. If you assume that the ciphertext will just be the original length (rounded up to the nearest 8 bytes), you could have problems when storing and reading the data.

    I don't see anything in your code that would obviously cause that, though. You correctly return the byte[] array returned from the transform function.