Search code examples
c#encryptionrsawindows-server-2012

RSA Decryption fails in Windows 2012 & Windows 10


RSA decryption is failing in Windows Server 2012 & Windows 10, but works like a charm in Windows 7. Have placed below the code that also contains the relevant keys used.

var rsa = new RSACryptoServiceProvider(1024);

const string privatekey = "<RSAKeyValue><Modulus>m38MvfdL8epfiYvgw6ylMB7zPAKSStQLklCQEOworQwJxw39bXdnm4717BUm5700vZCbG9GBgjwHUxmrFrFsSJxMIdYhokT/DuYOC9Nsf2fiX5Uq+WtBfbSneEr6yVk2VB1fgba6XxoK9O3CKzieR1XxPEofxGRjrXzMe8nIMNc=</Modulus><Exponent>AQAB</Exponent><P>33li38h5n1siKeu3LvsLF+JiytDAVLdRO6BkZ7btGcElTs/iir8ZIJFs2VvB5ELovk0iSBKZTNN/In4asEehaw==</P><Q>siDRbd2xQOyZnIOhfkjAt4QUNhskKRV56OkTvEawxloXZOssh0BjzuW8UVbiM3OuqgXUZm64eJyVghJacWXNRQ==</Q><DP>aafRWG5HGlGTCHDabcrhRsyQ2sTxedwl+uPtNJ/m35tS0T02JVUOQzieVvGr7Qi5U2fSgnLQqeMAo8UtRxTGuw==</DP><DQ>LB724Pi9k/BG6D6ufKI2of4kJ3a3kTmRlcBNtB/qX2cnTkb2I5YuYqwC5j7YDpiD1fdVsf2Q0ccvPSWgo1/s5Q==</DQ><InverseQ>YnPBkCyRyRnVWJPaJg507VdJpEPPeacdJ0wUJfiJgOfJPo01JLOWtgPWVqpW+pDTouv77qn7N1sIRo+IiyzsRA==</InverseQ><D>KEOLvxzr82Zm+qzXtJNd6sn43c8kpm+l12s5AsjD95soZPzAZLoIgAVStKD9hABASd3J7DghuuFkXCZHYQbsLLEeRY2TuuS/e6yyYV0+KNMRMrZAZ2DdWOdsfUmbQMiJNVTLmkwBgFLaFmcZ/DmPBMUYuJmFO9Tg6vEDCg45b5E=</D></RSAKeyValue>";
var dataByte = Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==");

rsa.FromXmlString(privatekey);

        //var dataNotWorkingByte = Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==");

        var dataWorkingByte = Convert.FromBase64String("I2S7t/BHFZo7JZFVUCHSSckHcWEASiZNjHmR5O1495y5RIej7d8PfnXjQYUrN1U352RAo373XSDuVhhFwS9XijI6lMJH/rlMjFIXOegcOrBJI406ZpF0dmbBc+Wq4rmBngT6fzrqvLLhijfRUq1m+K2dEfOkOuzRCsXKRKCOZBA=");

var descryptedString = Encoding.ASCII.GetString(decryptedByte);

The following exception is thrown

An unhandled exception of type 'System.Security.Cryptography.CryptographicException' occurred in mscorlib.dll Additional information: Bad Data.

EDIT Exception happens only when attempting to decrypt text with double padding (==). Have provided samples of working and not working texts

        var dataNotWorkingByte = Convert.FromBase64String("YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5mXFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWluBjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==");

        var dataWorkingByte = Convert.FromBase64String("I2S7t/BHFZo7JZFVUCHSSckHcWEASiZNjHmR5O1495y5RIej7d8PfnXjQYUrN1U352RAo373XSDuVhhFwS9XijI6lMJH/rlMjFIXOegcOrBJI406ZpF0dmbBc+Wq4rmBngT6fzrqvLLhijfRUq1m+K2dEfOkOuzRCsXKRKCOZBA=");

And the length of the data is well small and does not exceed 50 characters.

Thanks in advance for your time!!


Solution

  • Exception happens only when attempting to decrypt text with double padding (==). Have provided samples of working and not working texts

    The Base64 padding changes the length of the byte[], but RSA decryption requires a byte[] whose bit-length is the same as the key length.

    The Base64 value

    I2S7t/BHFZo7JZFVUCHSSckHcWEASiZNjHmR5O1495y5RIej7d8PfnXjQYUrN1U
    352RAo373XSDuVhhFwS9XijI6lMJH/rlMjFIXOegcOrBJI406ZpF0dmbBc+Wq4r
    mBngT6fzrqvLLhijfRUq1m+K2dEfOkOuzRCsXKRKCOZBA=
    

    is equal to the hexadecimal value

    2364BBB7F047159A3B2591555021D249C9077161004A264D8C7991E4ED78F79C
    B94487A3EDDF0F7E75E341852B375537E76440A37EF75D20EE561845C12F578A
    323A94C247FEB94C8C521739E81C3AB049238D3A6691747666C173E5AAE2B981
    9E04FA7F3AEABCB2E18A37D152AD66F8AD9D11F3A43AECD10AC5CA44A08E6410
    

    Which is 128 bytes, or 1024-bit, so it isn't an outright wrong value for RSA decryption.

    On the other hand, the Base64 value

    YfFFh5cquMP8qMls+7e1WF23addkU9vLuK4W5U8R0zclbw1SJk+8QC8K17dgN5m
    XFKEifj669H7fAKfUphWDLqDSsodfFcGbElOC5J9ybf30Or1NPH9g2OTjIAaWlu
    BjAYpg/qEtvJkvzwFpeqWoVOfNdwn51igCbPZKKi04tw==
    

    is equal to the hexadecimal value

    61F14587972AB8C3FCA8C96CFBB7B5585DB769D76453DBCBB8AE16E54F11D337
    256F0D52264FBC402F0AD7B76037999714A1227E3EBAF47EDF00A7D4A615832E
    A0D2B2875F15C19B125382E49F726DFDF43ABD4D3C7F60D8E4E320069696E063
    018A60FEA12DBC992FCF01697AA5A854E7CD7709F9D628026CF64A2A2D38B7
    

    Which is only 127 bytes. Therefore it is not a valid blob to decrypt under a 1024-bit key.

    The real error lies in whatever is producing that value. RSA encryption always produces an answer of the key size:

    RFC 3447, section 7 shows both OAEP and PKCS1-v1_5 as ending in I2OSP (c, k), where "k denotes the length in octets of the modulus n".

    I2OSP(x, xLen) has the cautionary note: "note that one or more leading digits will be zero if x is less than 256^(xLen-1)". My only speculation (aside from corrupted data) is that you somewhere encountered a system that removed the leading zeros as being irrelevant.