tonyweb Posted October 17, 2009 Posted October 17, 2009 (edited) 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. // 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 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 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 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 Regards, Tony Edited October 18, 2009 by tonyweb
Kurapica Posted October 17, 2009 Posted October 17, 2009 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 Functionthe 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
high6 Posted October 17, 2009 Posted October 17, 2009 Meh, I don't care for microsofts implementation for this kinda stuff. I use bouncy castle for .net crypto.
tonyweb Posted October 18, 2009 Author Posted October 18, 2009 (edited) 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 October 18, 2009 by tonyweb
Guest codrgi Posted October 26, 2009 Posted October 26, 2009 Just about what i was going to suggest, well anyway, glad to see you have to fixed now.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now