3

我正在开发一个 REST API。HttpClient客户端用服务器的公钥加密后,将其用户名和密码放在授权头中。用户名和密码总是由字母和数字组成,这意味着它可以用 ASCII 表示。

我正在使用此代码进行加密。

string encrypted = Encrypt (someText, crypto);

    public static string Encrypt (string plainText, RSACryptoServiceProvider crypto)
    {
        var plainData = GetBytes (plainText);
        var encryptedData = crypto.Encrypt (plainData, true);
        return GetString (encryptedData);
    }

    public static byte[] GetBytes (string str)
    {
        var bytes = new byte[str.Length * sizeof (char)];
        Buffer.BlockCopy (str.ToCharArray (), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    public static string GetString (byte[] bytes)
    {
        var chars = new char[bytes.Length / sizeof (char)];
        Buffer.BlockCopy (bytes, 0, chars, 0, bytes.Length);
        return new string (chars);
    }

问题是我在加密后得到这个字符串

꠨屰⭮⬎㔾䐛え멩戻덒ேꑰꑰ䵇᷹᷹᷶᷶虣虣ⱒ̿ⱒ̿ⱒ̿ঊࠎঊࠎঊࠎ飳枹飳枹飳枹쉦폩쉦폩쉦폩ᤫᤫᤫᤫ 뉋⭠夏旻浨፛᠏რ

我无法在授权标头中发送这些 Unicode 字符。有什么方法可以获取 ASCII 中的加密文本,以便可以轻松地通过 HttpClient 发送?

4

1 回答 1

2

您可以对其进行base64编码。Base64 编码生成的字符串适合通过支持 ASCII 字符串的传输方式发送。

public static string Encrypt (string plainText, RSACryptoServiceProvider crypto)
{
    var plainData = GetBytes (plainText);
    var encryptedData = crypto.Encrypt (plainData, true);
    return Convert.ToBase64String (encryptedData);
}

顺便说一句,我会用 ; 替换您用于将字符串转换为字节数组的自定义 GetBytes 方法Encoding.GetBytes。这是这样做的内置和首选方法。例如:

var plainData = System.Text.Encoding.UTF8.GetBytes(plainText);
于 2013-02-12T19:39:38.697 回答