Jump to content
View in the app

A better way to browse. Learn more.

Tuts 4 You

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Solved] RSA Crypting in .NET

Featured Replies

Posted

Hi guys,

this is my first attempt to use RSA in a .NET app. I looked for a solution for hours but I did not understand how to use

RSACryptoServiceProvider to import my chosen keys. :verymad:


// Imposta parametri
RSAParameters rsaParams = new RSAParameters();
rsaParams.Modulus = myData.getN;
rsaParams.Exponent = myData.getExponent; // Istanzia il crypter
CspParameters providerParam = new CspParameters(1, "Microsoft Enhanced Cryptographic Provider");
RSACryptoServiceProvider myRSA = new RSACryptoServiceProvider(48, providerParam); myRSA.ImportParameters(rsaParams); // ALWAYS BAD-DATA !!!

My Information:

- Modulus : new byte[] { 0x52, 0x42, 0x8E, 0x94, 0x44, 0x39 }

- Exponent: new byte[] { 0x04, 0x45, 0x7A, 0x97, 0x32, 0x0B }

ON the Internet I read almost all I found about but nothing helped me :dunno:

1) I tried to execute an Array.Reverse() ( as someone suggested ) ... but no luck !

2) I tried to pass to ctor key-len ( above I choose 48 bits )

3) I tried also to build the XmlString (base64) ... but fromXmlString gives me "Bad Data" too :verymad:

                StringBuilder sb = new StringBuilder();
sb.Append("<RSAKeyValue><Modulus>");
sb.Append(Convert.ToBase64String(N));
sb.Append("</Modulus><Exponent>");
sb.Append(Convert.ToBase64String(e));
sb.Append("</Exponent></RSAKeyValue>");

4) I looked on MSDN:

/*

URL: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx

Remarks

The RSACryptoServiceProvider supports key lengths from 384 bits to 16384 bits in increments of 8 bits if you have the Microsoft Enhanced Cryptographic Provider installed. It supports key lengths from 384 bits to 512 bits in increments of 8 bits if you have the Microsoft Base Cryptographic Provider installed.

*/

so I used an Array.Copy() into a 48-byte array either for N or for both N and e.


// parametri: N, e
// Occorre estendere le chiavi ad almeno (384 bit = 384/8 = 48 byte) ?
this.e = new byte[48];
this.N = new byte[48];
Array.Copy(N, 0, this.N, this.N.Length - N.Length, N.Length); this.e = new byte[48];
Array.Copy(e, 0, this.e, this.e.Length - e.Length, e.Length);

(Even here I tried Array.Reverse) but even so that damn "Bad Data" prompts up :verymad: Is it possible that that keySize identifies *real* modulus size (and not just the array one) ?

Microsoft information about this issue is practically inexistent.

Where am I wrong ?

Please, help me :help

Regards,

Tony

Edited by tonyweb

I don't know If I understand you but here is a simple RSA code I used in the past.


Private Function CheckLicense() As Boolean If Text_Name.Text.Trim.Length = 0 OrElse Text_Key.Text.Trim.Length = 0 Then Return False End If
Try '[1] Read Signature and Key Dim RSA As New Security.Cryptography.RSACryptoServiceProvider
RSA.FromXmlString("<RSAKeyValue><Modulus>4SaAqGqvtWlh647/Yr/TI8NdEAw0wqE+E2XvrKZPqV5RRXdS0gOJn3YbN7HwlBU0SYwbYLfOL+tOwH/1JZJccS/L9UrMb4dM7NtYZ8H9W7W9BsILMMNwg3VMr3CA4l2XmQihYGJPTghkA/jn7+mSUxFBtN7jgimlAIKr5KNBiTk=</Modulus><Exponent>AQAB</Exponent><P>/CZa3kfBcwbxrbcXp2aFimZA/t+En7o26XdkMw68X636KqiQl73wVqSwZmkUd/XNmMjo2NQi0BqrR4A2TxT8Hw==</P><Q>5JabmEXLj3FhRe/unERLx72btX2a+UCbSgtZmQUFRbqfvL0HMQxrA0T/kZKKrV/g8xjqAA0Y4Godr+auVMzPpw==</Q><DP>CJRthx698GIOGzEdtu6AIMN19rY4Vw8JC0yqtioMMt1Co+z0bpVh9jDIZ9OvhJ1yj35Wnfop7RbbOSWds3ctVQ==</DP><DQ>sY2OdBuafuPJc8JnK7gcyJwtiy5yJrMZK81fHe15Z+0K0FZfdKi5ooOAo7kYwIxdtVWfxMRnk0C5qHzc4n9ntw==</DQ><InverseQ>FBZjEL/dqXHb8IYGH1ghzsEjoTqFCE/dW+JeEmCIJDqAQH6fxyVzpciRpksg9BMHEOASoVzVIWOw4l/e6QRJxg==</InverseQ><D>xXCdPJOqGD0cuJRC0tcDEgadUphRoCgEJsCqiE2j6BOk03ULNM4TXroUrieloEZj/ucVjyBAePcxrU/Iq7UIyDedH80ChGQViA2NGMDNIzyqMR2j+ruwT8wwim41oI7D78m2AnjWBHcLISVaFo2v3Fp1teCtGB3aKbtAu/m3fI0=</D></RSAKeyValue>") 'We will generate Key from Name_Text.text
'We will generate RSA Signature from Key_Text.text 'Generate RSA Key from name
Dim Hasher As New Security.Cryptography.SHA1Managed
Dim Key() As Byte = Hasher.ComputeHash(System.Text.Encoding.Unicode.GetBytes(Text_Name.Text.Trim))
'Signature
Dim RSASig() As Byte
RSASig = Convert.FromBase64String(Text_Key.Text.Trim)
'Verify Key
Dim Ret As Boolean = RSA.VerifyData(Key, "SHA1", RSASig) Select Case Ret Case True Return True Case False Return False End Select Catch ex As Exception Return False End Try
End Function

the default Key size is 1028 which is big enough imho.

you can create a new RSA object then save it using the "ToXMLString" Method which returns that XML string you see here.

good luck

Meh, I don't care for microsofts implementation for this kinda stuff. I use bouncy castle for .net crypto.

  • Author

Thank you Kurapica for your code ... but that's not what I needed ;)

I needed a way to use RSA with a modulus lesser than 384 bit ( the minimum allowed by Microsoft implementation, it seems ).

I followed high6 suggestion and used "Bouncy Castle .NET" ( Open SSL.NET requires 3 accompany files ... bouncy castle has only one dll ).


RsaEngine myRSA = new RsaEngine();
BigInteger exponent = new BigInteger( getExponent() );
BigInteger modulus = new BigInteger( getN() ); Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters rsaParams = new Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters(false, modulus, exponent);
myRSA.Init(true, rsaParams);
byte[] encodedBytes = myRSA.ProcessBlock(to_encode, 0, to_encode.Length);

Thank you guys. Mission completed ;)

Regards,

Tony

Edited by tonyweb

Just about what i was going to suggest, well anyway, glad to see you have to fixed now.

Create an account or sign in to comment

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.