【发布时间】:2017-02-18 20:18:33
【问题描述】:
我正在开发一个 Steam 网络库,并尝试重建网络登录。它由两个步骤组成: 获取 RSA 密钥并将加密的密码发布到服务器。但大约。因为两个星期我无法让加密工作。
var rsa = new RSACryptoServiceProvider();
var rsaParameters = new RSAParameters {
Exponent = encryptPasswordModel.PublicKeyExp.HexToByte(),
Modulus = encryptPasswordModel.PublicKeyMod.HexToByte()
};
rsa.ImportParameters(rsaParameters);
var bytePassword = Encoding.ASCII.GetBytes(encryptPasswordModel.Password);
var encodedPassword = rsa.Encrypt(bytePassword, false);
return Convert.ToBase64String(encodedPassword);
这工作正常,但我相信 Steam rsa 加密的实施在某些时候发生了变化。目前可以在here找到加密。 Steam 还使用了一个名为 jsbn.js 的包。可以找到here。
encrypt: function($data, $pubkey) {
if (!$pubkey) return false;
$data = this.pkcs1pad2($data, ($pubkey.modulus.bitLength() + 7) >> 3);
if (!$data) return false;
$data = $data.modPowInt($pubkey.encryptionExponent, $pubkey.modulus);
if (!$data) return false;
$data = $data.toString(16);
if (($data.length & 1) == 1)
$data = "0" + $data;
return Base64.encode(Hex.decode($data));
}
pkcs1pad2: function($data, $keysize) {
if ($keysize < $data.length + 11)
return null;
var $buffer = [];
var $i = $data.length - 1;
while ($i >= 0 && $keysize > 0)
$buffer[--$keysize] = $data.charCodeAt($i--);
$buffer[--$keysize] = 0;
while ($keysize > 2)
$buffer[--$keysize] = Math.floor(Math.random() * 254) + 1;
$buffer[--$keysize] = 2;
$buffer[--$keysize] = 0;
return new BigInteger($buffer);
}
正如我们所见,我们有一个类似于自定义加密填充的东西,称为“pkcs1pad2”。我怎样才能在 C# 中以相同的方式实现这一点而没有那么多麻烦(最好的解决方案是 .net 核心解决方案,但它不是必需的)。
我已经用RSA.Create(); 尝试过,但还没有成功。
var rsaParameters = new RSAParameters {
Exponent = encryptPasswordModel.PublicKeyExp.HexToByte(),
Modulus = encryptPasswordModel.PublicKeyMod.HexToByte()
};
var rsa2 = RSA.Create();
rsa2.ImportParameters(rsaParameters);
var byteEncodedPassword = rsa2.Encrypt(Encoding.ASCII.GetBytes(encryptPasswordModel.Password), RSAEncryptionPadding.Pkcs1);
var encryptedPassword = Convert.ToBase64String(byteEncodedPassword);
我认为这还没有解决,因为填充,但我如何能够扩展 RSAEncryptionPadding 的算法。
【问题讨论】:
标签: c# encryption cryptography rsa steam