Шифрование Javascript с использованием RSA совместимо С.Сеть с использованием библиотеки надувного замка
Мне нужно сделать шифрование RSA с помощью javascript для пароля входа пользователя, который отправляется со страницы входа в веб-приложение на сервер для расшифровки библиотекой C#, предоставляемой http://www.bouncycastle.org/csharp.
используя следующий код:
// Generate public key using RSA encryption protected void Session_Start(object sender, EventArgs e) { if (System.Runtime.Caching.MemoryCache.Default.Get("privateKey") == null) { RsaKeyPairGenerator rsaKeyPairGnr = new RsaKeyPairGenerator(); rsaKeyPairGnr.Init(new Org.BouncyCastle.Crypto.KeyGenerationParameters(new SecureRandom(), 1024)); Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair keyPair = rsaKeyPairGnr.GenerateKeyPair(); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyPair.Public); var pubKeyPEM = FormatPem(publicKeyInfo.GetEncoded().ToBase64(), "PUBLIC KEY"); RsaKeyParameters publicKey = (RsaKeyParameters)keyPair.Public; RsaKeyParameters privateKey = (RsaKeyParameters)keyPair.Private; System.Runtime.Caching.MemoryCache.Default.Add("publicKey", pubKeyPEM, DateTimeOffset.MaxValue); System.Runtime.Caching.MemoryCache.Default.Add("publicKeyX", publicKey, DateTimeOffset.MaxValue); System.Runtime.Caching.MemoryCache.Default.Add("privateKey", privateKey, DateTimeOffset.MaxValue); } } // Convert SubjectPublicKeyInfo object to PEM format private static string FormatPem(string pem, string keyType) { var sb = new StringBuilder(); sb.AppendFormat("-----BEGIN {0}-----\n", keyType); int line = 1, width = 64; while ((line - 1) * width < pem.Length) { int startIndex = (line - 1) * width; int len = line * width > pem.Length ? pem.Length - startIndex : width; sb.AppendFormat("{0}\n", pem.Substring(startIndex, len)); line++; } sb.AppendFormat("-----END {0}-----\n", keyType); return sb.ToString(); } //Login aspx : javascript code for the login button get public key and password and encrypt using JSEncrypt library <asp:Button ID="LoginButton" runat="server" OnClientClick="onLoginButtonClicked()" CommandName="Login" Text="Log In" ValidationGroup="Login1" /> function onLoginButtonClicked() { var key = $("#<%= hdnkey.ClientID%>").val(); var password = $("#Login1_Password").val(); var encrypt = new JSEncrypt(); encrypt.setPublicKey(key); var encrypted = encrypt.encrypt(password); $("#<%= hdnEncryptedPass.ClientID%>").val(encrypted); } //Login aspx.cs protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) return; if (System.Runtime.Caching.MemoryCache.Default.Get("publicKey") != null) { var publicKey = System.Runtime.Caching.MemoryCache.Default.Get("publicKey"); this.hdnkey.Value = publicKey.ToString(); } } // servre side code that decrypt the encrypted password using the private key // it gives error while decrypt in the follwoing line // byte[] deciphered = cipher.ProcessBlock(ciphered, 0, ciphered.Length); //the error message is: input too large for RSA cipher. protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { try { RsaKeyParameters privateKey = (RsaKeyParameters)System.Runtime.Caching.MemoryCache.Default.Get("privateKey"); string encrypted = this.hdnEncryptedPass.Value; SHA512Managed hash = new SHA512Managed(); SecureRandom randomNumber = new SecureRandom(); byte[] encodingParam = hash.ComputeHash(Encoding.UTF8.GetBytes(randomNumber.ToString())); IAsymmetricBlockCipher cipher = new RsaEngine(); UTF8Encoding utf8enc = new UTF8Encoding(); cipher.Init(false, privateKey); byte[] ciphered = Encoding.UTF8.GetBytes(encrypted); byte[] deciphered = cipher.ProcessBlock(ciphered, 0, ciphered.Length); var pass = utf8enc.GetString(deciphered); } catch (Exception ee) { throw; } e.Authenticated = Membership.ValidateUser(Login1.UserName, Login1.Password); }
Что я уже пробовал:
я попробовал .Сетевая библиотека включена www.bouncycastle.org/csharp но это только серверный код.мне нужен код javascript, который сделал шифрование с помощью шифрования RSA и совместим с шифрованием RSA, реализованным с помощью C# и .NET framework библиотекой bouncy castle.
я попробовал использовать javascript-библиотеку Jscript, но она потерпела неудачу.
** код Javascript шифрует пароль и отправляет его на сервер с большей длиной, чем размер, который принимает метод дешифрования.
F-ES Sitecore
Шифрование работает только в том случае, если ключи секретны, но в javascript все открыто, поэтому вы не можете держать ключи в секрете. Google "RSA javascript", и если вы не находите никаких решений, почему вы так думаете? Как уже упоминалось в решении 1, то, что вы делаете, не имеет реальной заслуги, вам нужно сказать, почему вы хотите реализовать это, и посмотреть, есть ли у кого-то решение, поскольку это не так.