public async Task<bool> Verify() { var sw = Stopwatch.StartNew(); Console.WriteLine("enter Verify"); var v = new RSACryptoStream(NamedKeyPairs.Key1PrivateKey.RSAParameters).VerifyString(this.SpecialData, this.SpecialDataSignature48); Console.WriteLine("exit Verify " + new { sw.ElapsedMilliseconds }); return v; }
public static void Main(string[] args) { // Z:\jsc.svn\examples\javascript\android\Test\TestAndroidWebCryptoKeyImport\TestAndroidWebCryptoKeyImport\Application.cs // jvm wants 512bits keys // jvmMinKeySize = 23 var jvmMinKeySize = MaxDataFromdwKeySize(512); var keygensw = Stopwatch.StartNew(); //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(4096)); //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(2048)); //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(256)); //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(1024)); //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(64)); // 105 //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(65)); // 106 //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(49)); // 90 //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(39)); // 80 var MaxData = 7; var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(MaxData)); // 50 //var rsa = new RSACryptoServiceProvider(dwKeySize: dwKeySizeFromMaxData(4)); // error // Additional information: Invalid flags specified. var struct_rsaprivate = rsa.ExportParameters(includePrivateParameters: true); var bytes_rsaprivate = rsa.ExportCspBlob(includePrivateParameters: true); keygensw.Stop(); // { ElapsedMilliseconds = 33, KeySize = 840 } // { ElapsedMilliseconds = 103558, KeySize = 8520 } // { ElapsedMilliseconds = 35335, KeySize = 8520 } Console.WriteLine(new { keygensw.ElapsedMilliseconds, rsa.KeySize, maxdata = MaxDataFromdwKeySize(rsa.KeySize) }); var fOAEP = true; // Additional information: Bad Length. //var data = rsa.Encrypt(Encoding.UTF8.GetBytes("".PadLeft(37, '?')), fOAEP: fOAEP); var data = rsa.Encrypt(Encoding.UTF8.GetBytes("".PadLeft(MaxData - 1, '?')), fOAEP: fOAEP); var datadecrypt = rsa.Decrypt(data, fOAEP: fOAEP); // http://stackoverflow.com/questions/1199058/how-to-use-rsa-to-encrypt-files-huge-data-in-c-sharp // data = {byte[256]} var rsa2 = new RSACryptoServiceProvider(); //rsa2.ImportParameters(struct_rsaprivate); rsa2.ImportCspBlob(bytes_rsaprivate); var decryptsw = Stopwatch.StartNew(); //var data2 = rsa2.Decrypt(data, fOAEP: false); // Additional information: Error occurred while decoding OAEP padding. var data2 = rsa2.Decrypt(data, fOAEP: fOAEP); var text2 = Encoding.UTF8.GetString(data2); decryptsw.Stop(); // { ElapsedMilliseconds = 0, Length = 105, text2 = hello world } Console.WriteLine(new { decryptsw.ElapsedMilliseconds, rsa.KeySize, maxidata = MaxDataFromdwKeySize(rsa.KeySize), maxodata = dwKeySizeToEncryptedDataLength(rsa.KeySize), odata = data.Length, itext = text2.Length }); // rsa cannot encrypt too much data huh? // unless we have a bigger key? //{ ElapsedMilliseconds = 0, KeySize = 384, maxidata = 7, maxodata = 48, odata = 48, itext = 37 } // this is how we rsa encrypt with small key var s = new RSACryptoStream(rsa2); var sdata = s.EncryptString("hello world".PadRight(128, ' ')); var stext = s.DecryptString(sdata); // now how do we sign it? // http://blogs.msdn.com/b/alejacma/archive/2008/06/25/how-to-sign-and-verify-the-signature-with-net-and-a-certificate-c.aspx // https://msdn.microsoft.com/en-us/library/9tsc5d0z(v=vs.110).aspx var sign3 = rsa2.SignData(data2, new SHA1CryptoServiceProvider()); var stextu = stext.ToUpper(); var verify3 = rsa2.VerifyData(Encoding.UTF8.GetBytes(stextu), new SHA1CryptoServiceProvider(), sign3); //verify3 = false // verify3 = true // Z:\jsc.svn\examples\java\hybrid\JVMCLRRSA\JVMCLRRSA\Program.cs // + InnerException {"Common Language Runtime detected an invalid program."} System.Exception {System.InvalidProgramException} //var rsa3 = new RSACryptoStream(NamedKeyPairs.Key1PrivateKey.CSPBlob); var rsa3 = new RSACryptoStream(NamedKeyPairs.Key1PrivateKey.RSAParameters); Console.WriteLine(new { rsa3.KeySize, rsa3.EncryptedDataChunkSize }); var rsa3e = rsa3.EncryptString(("hello world " + new { rsa3.rsa.KeySize }).PadRight(1024)); var rsa3t = rsa3.DecryptString(rsa3e); // Z:\jsc.svn\examples\javascript\Test\TestWebCrypto\TestWebCrypto\Application.cs //at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) //at System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash, Int32 cbHash, ObjectHandleOnStack retSignature) //at System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash) //at System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, Int32 calgHash) //at System.Security.Cryptography.RSACryptoServiceProvider.SignData(Byte[] buffer, Object halg) //at TestWebServiceRSA.Program.Main(String[] args) in z:\jsc.svn\examples\javascript\crypto\test\TestWebServiceRSA\TestWebServiceRSA\Program.cs:line 131 var rsa3sig = rsa3.rsa.SignData( Encoding.UTF8.GetBytes(rsa3t), new SHA1CryptoServiceProvider() ); var rsa3verify = rsa3.rsa.VerifyData( Encoding.UTF8.GetBytes(rsa3t), new SHA1CryptoServiceProvider(), rsa3sig ); //rsa3verify = true var rsa3tu = rsa3t.ToUpper(); var rsa3uverify = rsa3.rsa.VerifyData( Encoding.UTF8.GetBytes(rsa3tu), new SHA1CryptoServiceProvider(), rsa3sig ); var rsa3tusig = rsa3.SignString(rsa3tu); var rsa3tuverify = rsa3.VerifyString(rsa3tu, rsa3tusig); // rsa3sig = {byte[48]} // rsa3uverify = false RewriteToUltraApplication.AsProgram.Launch(typeof(Application)); }