шифрования RSA и дешифрование посадки

  В последнее время компании после принятия проекта, информация о клиентах технология безопасности персонал, приглашенный на наш сайт и различные тесты безопасности для устранения проблем, среди которых проблемы шифрования при посадке. Было бы, если только простое шифрование может быть использован непосредственно на переднем плане шифрования MD5, зашифрованное значение может быть добавлена ​​в базу данных. Но теперь проект имеет много пользователей, пароль шифруется в MD5 фоне. Это будет не просто на переднем плане с шифрованием MD5, может быть ограниченные возможностями, несовместимое шифрованием MD5 приемом шифрования MD5 с фоновыми значениями, используемыми, когда пользователь не может войти в пароль выравнивания не удастся посадка. Используйте только асимметричного шифрования, дешифрования фона с использованием переднего плана шифрования MD5 шифрования, а затем сравнить эту практику, чтобы использовать наименьшие изменения. После информации онлайн поиска с помощью асимметричного шифрования RSA.

https://www.cnblogs.com/amylis_chen/p/6054414.html

Фронтальный код

 <Сценарий SRC = "http://code.jquery.com/jquery-1.8.3.min.js"> </ скрипт>

 <Сценарий SRC = "http://passport.cnblogs.com/scripts/jsencrypt.min.js"> </ скрипт>

<Скрипт>

   вар шифровать = новый JSEncrypt ();

    encrypt.setPublicKey ( «инструмент может быть использован для создания открытого ключа»);
    вар = UserPwd encrypt.encrypt (ввод пароля); // зашифрованный пароль

</ Скрипт>

Back-конец кода

вар ОткрытыйКлючи = « открытый ключ может быть сгенерирован с помощью инструмента»

вар PrivateKey = «частный ключ может быть сгенерирован с помощью инструмента»

= Новый новый RSACrypto rsaCrypto RSACrypto (PrivateKey, ОткрытыйКлюч);
UserPwd = rsaCrypto.Decrypt (UserPwd); // пароль расшифрован, пароль значение

 

/// <резюме>
/// RSA非对称加密
/// </ резюме>
общественный класс RSACrypto
{
частное RSACryptoServiceProvider _privateKeyRsaProvider;
частный RSACryptoServiceProvider _publicKeyRsaProvider;

общественного RSACrypto (строка PrivateKey, строка ОткрытыйКлюч = NULL)
{
если (string.IsNullOrEmpty (PrivateKey)!)
{
_privateKeyRsaProvider = CreateRsaProviderFromPrivateKey (PrivateKey);
}

если (string.IsNullOrEmpty (ОткрытыйКлюч)!)
{
_publicKeyRsaProvider = CreateRsaProviderFromPublicKey (ОткрытыйКлюч);
}
}

публичная строка Расшифровать (строка зашифрованного текста)
{
если (_privateKeyRsaProvider == NULL)
{
певд Exception ( "_ privateKeyRsaProvider равна нулю");
}
Вернуть Encoding.UTF8.GetString (_privateKeyRsaProvider.Decrypt (System.Convert.FromBase64String (шифртекста), ложно));
}

публичная строка Encrypt (строка текста)
{
если (_publicKeyRsaProvider == NULL)
{
певд Exception ( "_ publicKeyRsaProvider равна нулю");
}
Вернуть Convert.ToBase64String (_publicKeyRsaProvider.Encrypt (Encoding.UTF8.GetBytes (текст), ложно));
}

частные RSACryptoServiceProvider CreateRsaProviderFromPrivateKey (строка PrivateKey)
{
вар privateKeyBits = System.Convert.FromBase64String (PrivateKey);

был RSA = новый RSACryptoServiceProvider ();
был RSAparams = новые RSAParameters ();

используя (BinaryReader binr = новый BinaryReader (новый MemoryStream (privateKeyBits)))
{
Байт Ь = 0;
USHORT twobytes = 0;
twobytes = binr.ReadUInt16 ();
если (twobytes == 0x8130)
binr.ReadByte ();
иначе если (twobytes == 0x8230)
binr.ReadInt16 ();
еще
певд Exception ( "Неожиданное считанное значение binr.ReadUInt16 ()");

twobytes = binr.ReadUInt16 ();
если (! twobytes = 0x0102)
проливают новый Exception ( "Неожиданный вариант");

BT = binr.ReadByte ();
если (! Ы = 0x00)
певд Exception ( "Неожиданное считанное значение binr.ReadByte ()");

RSAparams.Modulus = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.Exponent = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.D = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.P = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.Q = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.DP = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.DQ = binr.ReadBytes (GetIntegerSize (binr));
RSAparams.InverseQ = binr.ReadBytes (GetIntegerSize (binr));
}

RSA.ImportParameters (RSAparams);
возврата RSA;
}

Частный INT GetIntegerSize (BinaryReader binr)
{
Байт Ь = 0;
байт LowByte = 0x00;
байт highbyte = 0x00;
Количество INT = 0;
BT = binr.ReadByte ();
если (Ь = 0x02!)
возвращают 0;
BT = binr.ReadByte ();

если (Ь == 0x81)
Count = binr.ReadByte ();
остальное ,
если (Ь == 0x82)
{
highbyte = binr.ReadByte ();
LowByte = binr.ReadByte ();
байт [] modint = {LowByte, highbyte, 0x00, 0x00};
Count = BitConverter.ToInt32 (modint, 0);
}
Иначе
{
Count = BT;
}

в то время как (binr.ReadByte () == 0x00)
{
кол - = 1;
}
Binr.BaseStream.Seek (-1, SeekOrigin.Current);
Количество возврата;
}

Частный RSACryptoServiceProvider CreateRsaProviderFromPublicKey (строка publicKeyString)
{
// кодируются OID последовательность для PKCS # 1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
байт [] SeqOID = {0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86 , 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00};
байт [] x509key;
байт [] сл = новый байт [15];
INT x509size;

x509key = Convert.FromBase64String (publicKeyString);
x509size = x509key.Length;

// --------- Настройка потока читать ASN.1 закодированы SubjectPublicKeyInfo блоб ------
используя (MemoryStream MEM = новый MemoryStream (x509key))
{
используя (BinaryReader binr = новый BinaryReader (MEM )) // обернуть памяти потока с BinaryReader для легкого чтения
{
байт Bt = 0;
USHORT twobytes = 0;

twobytes = binr.ReadUInt16 ();
если (twobytes == 0x8130) // считывание данных как мало порядок Endian (фактический порядок данных для последовательности 30 81)
binr.ReadByte (); // заранее 1 байт
иначе , если (twobytes == 0x8230)
binr.ReadInt16 (); // авансовые 2 байта
еще
возвращение NULL;

SEQ = binr.ReadBytes (15); // прочитать Sequence OID ,
если (! CompareBytearrays (Seq, SeqOID)) // убедитесь , что последовательность для OID является правильным
возвращение нулевой;

twobytes = binr.ReadUInt16 ();
если (twobytes == 0x8103) // чтения данных , как навести порядок с обратным порядком байтов (фактический порядок данных для битовой строки 03 81)
binr.ReadByte (); // заранее 1 байт
иначе , если (twobytes == 0x8203)
binr.ReadInt16 (); // авансовые 2 байта
еще
возвращение NULL;

BT = binr.ReadByte ();
если (Ь = 0x00!) // ожидаем нулевой байт следующего
возвращения нуль;

twobytes = binr.ReadUInt16 ();
если (twobytes == 0x8130) // считывание данных как мало порядок Endian (фактический порядок данных для последовательности 30 81)
binr.ReadByte (); // заранее 1 байт
иначе , если (twobytes == 0x8230)
binr.ReadInt16 (); // авансовые 2 байта
еще
возвращение NULL;

twobytes = binr.ReadUInt16 ();
байт LowByte = 0x00;
байт highbyte = 0x00;

если (twobytes == 0x8102) // считывание данных как мало порядок Endian (фактический порядок данных для целого числа 02 : 81)
LowByte = binr.ReadByte (); // читать дальше байт , который является байт по модулю
иначе , если (twobytes == 0x8202)
{
highbyte = binr.ReadByte (); // 2 байта заранее
LowByte = binr.ReadByte ();
}
Еще
возвращение нулевой;
байт [] modint = {LowByte, highbyte, 0x00, 0x00}; // обратный порядок байт , так как ключ ASN.1 использует большой заказ Endian
INT modsize = BitConverter.ToInt32 (modint, 0);

INT firstbyte = binr.PeekChar ();
если (firstbyte == 0x00)
{// если первые байты (самый высокий порядок) по модулю равно нуль, не включает в себя это
binr.ReadByte (); // пропустить эту нулевые байты
modsize - = 1; // уменьшить размер буфера модуля на 1
}

байт [] = модуль упругости binr.ReadBytes (modsize); // считываем модуля байтов

(! binr.ReadByte () = 0x02) , если // ожидать Integer для экспонента данных
возвращаемого нуля;
INT expbytes = (целое) binr.ReadByte (); // должны только один байты для фактических данных экспонентов (для всех полезных значений)
Byte [] = показатель binr.ReadBytes (expbytes);

// ------- создать RSACryptoServiceProvider экземпляр и инициализировать с помощью открытого ключа -----
RSACryptoServiceProvider RSA = новый RSACryptoServiceProvider ();
RSAParameters RSAKeyInfo = новые RSAParameters ();
RSAKeyInfo.Modulus = модуль упругости;
RSAKeyInfo.Exponent = показатель;
RSA.ImportParameters (RSAKeyInfo);

возврата RSA;
}

}
}

частная BOOL CompareBytearrays (байты [] а, байты [] б)
{
если (a.length = b.Length!)
вернуться ложным;
INT = 0;
Еогеасп (байты с в а)
{
если (! с = Ь [I])
возвращает ложь;
я ++;
}
Возвращает истину;
}
}

RSA инструмент генерации ключей пары --------- http://web.chacuo.net/netrsakeypair

Пожалуйста, выберите PKCS # 1, чтобы сгенерировать открытый ключ и секретный ключ

 

рекомендация

отwww.cnblogs.com/w1-y2-q5/p/11695070.html