ÿþ<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>System.Security.Cryptography.RSA</title> <link type="text/css" rel="stylesheet" href="../System.Web.UI.Interface.debug.css" /> <script type="text/javascript" language="JavaScript" src="../System.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.IO.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.Text.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.Convert.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.BitConverter.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.BigInt.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.Security.Cryptography.SHA1.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.Security.Cryptography.debug.js"></script> <script type="text/javascript" language="JavaScript" src="../System.Security.Cryptography.RSA.debug.js"></script> <script type="text/javascript" language="javascript"> //#region Log Function function WriteLog(text) { Trace.Write("<code>" + text + "</code>"); } function WriteEnc(input, output) { WriteLog("Transform: " + System.BitConverter.ToString(input, '') + " -> " + System.BitConverter.ToString(output, '')); } //#endregion // http://www.leemon.com/crypto/BigInt.html //http: //www.di-mgt.com.au/rsa_alg.html#note1 function Window_Load() { Trace.IsEnabled = true; WriteLog("Start Demo"); $("EncryptButton").onclick = EncryptButton_Click; $("DecryptButton").onclick = DecryptButton_Click; $("TestButton").onclick = TestButton_Click; $("NewKeyButton").onclick = NewKeyButton_Click; $("KeyTextBox").value = xmlParamsDefault; } window.onload = Window_Load; // RSA 512 bit key. var xmlParamsDefault = "<RSAKeyValue>" + "<Modulus>pxtmFnrGI6Sb8ziyY+NRUDuQ4b/ETw5WabQ4daFQqzsCEr/6J/LLBU/2D5mO5/Wu5U/Rya1E55aYFZeaZMNqAw==</Modulus>" + "<Exponent>AQAB</Exponent>" + "<P>2TsVXWPEvDIJv/gd2rX9k0UOyXuaYgoAchIH6vUicis=</P>" + "<Q>xO4+OYREQfqYRQK7y73+RaUG0IxobT0OQ0c+Ok2hc4k=</Q>" + "<DP>K7/xgpiIU9rECeyfnp/OjS14V+3T3vDivBaTj6eFI3c=</DP>" + "<DQ>K4N9ClZ4gp+tn6oP9t//XEIvtEsiE+kmyqTmUhmvMAk=</DQ>" + "<InverseQ>p7o4BOlKZQZ693R1ViZ66y5gTjUkNNTd2za7/1YGBCs=</InverseQ>" + "<D>XZqFVrYy4qhECruJgVZFp/GVuD5Y0gev88nVjl5r911QT+I8vgJSklTso7jTlpMtf2oe7UZ0WRWEtgPS3tZn4Q==</D>" + "</RSAKeyValue>"; function GetNewRsaProvider(dwKeySize) { // Create a new instance of RSACryptoServiceProvider. if (!dwKeySize) dwKeySize = 512; return new System.Security.Cryptography.RSACryptoServiceProvider(dwKeySize); } function NewKeyButton_Click(sender, e) { var keySize = Number($("KeySizeDropDownList").value); var rsa = GetNewRsaProvider(keySize); $("KeyTextBox").value = rsa.ToXmlString(true); } function GetRsaKey(includePrivateParameters) { var xmlParams = $("KeyTextBox").value; // ------------------------------------------------ // RSA Keys // ------------------------------------------------ var rsa = GetNewRsaProvider(); // Import parameters from xml. rsa.FromXmlString(xmlParams); // Export RSA key to RSAParameters and include: // false - Only public key required for encryption. // true - Private key required for decryption. return rsa.ExportParameters(includePrivateParameters); } function EncryptButton_Click(sender, e) { var decryptedBytes = System.Text.Encoding.UTF8.GetBytes($("DataTextBox").value); var doOaepPadding = $("PaddingDropDownList").options[$("PaddingDropDownList").selectedIndex].value == "OAEP"; // ------------------------------------------------ // Encrypt // ------------------------------------------------ var rsa = GetNewRsaProvider(); // Import the RSA Key information. rsa.ImportParameters(GetRsaKey(false)); // Encrypt the passed byte array and specify OAEP padding. var encryptedBytes = rsa.Encrypt(decryptedBytes, doOaepPadding); var encryptedString = System.Convert.ToBase64String(encryptedBytes) // ------------------------------------------------ // Display the encrypted data. //var encryptedString = System.BitConverter.ToString(encryptedBytes, ""); $("EncryptedTextBox").value = encryptedString; } function DecryptButton_Click(sender, e) { //var encryptedBytes = System.Convert.HexStringToBytes($("EncryptedTextBox").value); var encryptedBytes = System.Convert.FromBase64String($("EncryptedTextBox").value); var doOaepPadding = $("PaddingDropDownList").options[$("PaddingDropDownList").selectedIndex].value == "OAEP"; // ------------------------------------------------ // Decrypt // ------------------------------------------------ var rsa = GetNewRsaProvider(); // Import the RSA Key information. rsa.ImportParameters(GetRsaKey(true)); // Decrypt the passed byte array and specify OAEP padding. var decryptedBytes = rsa.Decrypt(encryptedBytes, doOaepPadding); // ------------------------------------------------ // Display the decrypted data. var decryptedString = System.Text.Encoding.UTF8.GetString(decryptedBytes); $("DecryptedTextBox").value = decryptedString; } var maxTests = 0; function TestButton_Click(sender, e) { maxTests = 1000; setTimeout(DoWork, 10); } function DoWork(sender, e) { var text = $("DataTextBox").value; var decryptedBytes = System.Text.Encoding.UTF8.GetBytes(text); var doOaepPadding = $("PaddingDropDownList").options[$("PaddingDropDownList").selectedIndex].value == "OAEP"; var rsa = GetNewRsaProvider(); rsa.ImportParameters(GetRsaKey(true)); var encryptedBytes = rsa.Encrypt(decryptedBytes, doOaepPadding); var decryptedString = ""; try { // Decrypt the passed byte array and specify OAEP padding. decryptedBytes = rsa.Decrypt(encryptedBytes, doOaepPadding); decryptedString = System.Text.Encoding.UTF8.GetString(decryptedBytes); } catch (ex) { WriteLog(encryptedBytes); } maxTests--; var success = (text == decryptedString); WriteLog(maxTests + ". bytes: " + encryptedBytes.length + " " + success); if (maxTests > 0 && success) setTimeout(DoWork, 10); } </script> <style type="text/css"> .style1 { color: #808080; } </style> </head> <body> <table border="0" cellpadding="0" cellspacing="4"> <tbody> <tr> <td> RSA Key: </td> <td> <textarea name="KeyTextBox" id="KeyTextBox" style="width: 500px;" cols="128" rows="3"></textarea> <br /> <span class="style1">Note: You can use larger keys, but generation of keys larger than 512-bits on</span><br class="style1" /> <span class="style1">JavaScript is very slow.</span> </td> <td> <br /> <select name="KeySizeDropDownList" id="KeySizeDropDownList"> <option value="256">256-bit</option> <option value="384">384-bit</option> <option selected="selected" value="512">512-bit</option> <option value="768">768-bit</option> <option value="1024">1024-bit</option> </select><br /> <input id="NewKeyButton" value="New Key" type="button" /> </td> </tr> <tr> <td> </td> <td> Padding: <select name="PaddingDropDownList" id="PaddingDropDownList"> <option selected="selected" value="PKCS">Direct Encryption (PKCS#1 v1.5)</option> <option value="OAEP">OAEP padding (PKCS#1 v2)</option> </select> </td> </tr> <tr> <td> Data: </td> <td> <input name="DataTextBox" value="abcdef_01234" id="DataTextBox" style="width: 500px;" type="text" /> </td> <td> <input name="EncryptButton" value="Encrypt" id="EncryptButton" type="button" /> </td> </tr> <tr> <td> Encrypted: </td> <td> <textarea name="EncryptedTextBox" id="EncryptedTextBox" style="width: 500px;" cols="128" rows="3"></textarea> </td> <td valign="bottom"> <input name="DecryptButton" value="Decrypt" id="DecryptButton" type="button" /> <input name="TestButton" value="Test" id="TestButton" type="button" style="display: none" /> </td> </tr> <tr> <td> Decrypted: </td> <td> <textarea name="DecryptedTextBox" id="DecryptedTextBox" style="width: 500px;" cols="128" rows="3"></textarea> </td> <td> </td> </tr> </tbody> </table> <br /> <iframe id="TraceLog" style="width: 100%; height: 200px;"></iframe> </body> </html>