Шифрование RSA С#
Решил сделать авторизацию в Steam через HttpWebRequest-HttpWebResponse,но столкнулся с проблемой шифрования данных.После первого запроса с логином ,Steam отправляет в response :
publickey_exp: "010001"
publickey_mod: "d09d5d926b94ea86c6971459486ce59d76b2b4682ddfb7d8fae9d9c68733835ecebb8c6a2c7463dd237c17c06fcc689c081d358c12dec82a68b4cef3fffd4ba9cbe0ee7397ac73caa4b0814d4932c7c33e098d91213972dd8fdad4e5de57628cbbc707066cb18f42d04463e9fa15632a26e9c12db4b5d74c4f7d06ec6c48fcfbcd39b5d40380a956b134cbf8afd74a2f5c761d1e0b0194fa0d4b9d1d489f55fd94471762c59765a566d193234e300eb5072e2254172dfbda9b1989d1edf8edcd1ba918b6bd7e3d29e8c6ba3488c38faa18935db2337fd384cf6d13e038a924d7280ab02b3279dfefdae1bf14587e0f0b8233eb36aa7bbb2a7e76a4b7e6abd0a3"
success: true
timestamp: "..."
token_gid: "..."
И в следующем запросе я должен отправить шифрованный пароль.Алгоритмы ,которые использует Steam(https://steamcommunity-a.akamaihd.net/public/shared/javascript/crypto/rsa.js)Использует он их таким образом: (https://steamcommunity-a.akamaihd.net/public/shared/javascript/crypto/jsbn.js) (https://steamcommunity-a.akamaihd.net/public/shared/javascript/login.js?v=dlXLXZHEdG_R&l=russian)
var form = this.m_$LogonForm[0];
var pubKey = RSA.getPublicKey(results.publickey_mod, results.publickey_exp);
var username = this.m_strUsernameCanonical;
var password = form.elements['password'].value;
password = password.replace(/[^\x00-\x7F]/g, ''); // remove non-standard-ASCII characters
var encryptedPassword = RSA.encrypt(password, pubKey);
var rgParameters = {
password: encryptedPassword,
username: username,
twofactorcode: authCode,
emailauth: form.elements['emailauth'] ? form.elements['emailauth'].value : '',
loginfriendlyname: form.elements['loginfriendlyname'] ? form.elements['loginfriendlyname'].value : '',
captchagid: this.m_gidCaptcha,
captcha_text: form.elements['captcha_text'] ? form.elements['captcha_text'].value : '',
emailsteamid: this.m_steamidEmailAuth,
rsatimestamp: results.timestamp,
remember_login: ( form.elements['remember_login'] && form.elements['remember_login'].checked ) ? 'true' : 'false'
};
Как реализовать что-то подобное на C#,может кто-то сталкивался?Или в каком направлении копать? Заранее спасибо за советы.
Пробовал что-то такое:Но вылетала ошибка System.FormatException: Недопустимая длина строки или массива знаков Base-64
Asn1Object obj = Asn1Object.FromByteArray(Convert.FromBase64String(stringPublicKey));
DerSequence publicKeySequence = (DerSequence)obj;
DerBitString encodedPublicKey = (DerBitString)publicKeySequence[1];
DerSequence publicKey = (DerSequence)Asn1Object.FromByteArray(encodedPublicKey.GetBytes());
DerInteger modulus = (DerBitString)publicKey[0];
DerInteger exponent = (DerBitString)publicKey[1];
RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue);
RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(parameters);
byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt);
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true);
return Convert.ToBase64String(encryptedData);
Где stringPublicKey=publickey_mod+" "publickey_exp