4

我在 C# 中有以下代码:

主班

X509Certificate2 cert = new X509Certificate2("C:/test.pfx", "hello", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);

            Encryption enc = new Encryption();
            string encrypted = enc.Encrypt("hello there", cert);
            string decrypted = enc.Decrypt(encrypted, cert);
            Console.WriteLine("Encrypted Text: " + encrypted);
            Console.WriteLine("Decrypted Text: " + decrypted);

加密类

public string Encrypt(string plainText, X509Certificate2 cert)
{
    RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
    byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
    byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
    string encryptedText = encryptedBytes.ToString();
    return encryptedText;
}

public string Decrypt(string encryptedText, X509Certificate2 cert)
{
    RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
    byte[] encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
    byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
    string decryptedText = decryptedBytes.ToString();
    return decryptedText;
}

如您所见,在主类中我正在导入证书。然后我正在创建一个 Encryption 类的实例。然后我将明文与证书一起传递给 Encrypt 方法,以获取加密文本。之后,我将加密的文本传递给 Decrypt 方法以取回明文。

我的问题是打印加密文本的结果是 System.[]Byte (如果我注释掉解密调用)。如果我不注释掉解密调用,我会得到一个 Cryptographic Exception: Bad Data in the decryption 方法。

我猜 encryptedBytes 数组没有正确转换为字符串。此外,我不确定我是否正确形成了 RSAEncryptionProvider。请问我该如何解决?

更新

我解决了一个问题。从字节数组转换为字符串时,我不得不使用 Encoding.UTF8.GetString(EncryptedBytes)。现在的问题是,解密方法给了我另一个加密异常(他要解密的数据超过了这个 128 字节模数的最大值)。

有谁知道为什么会发生这种情况以及如何解决它?

4

2 回答 2

4

您可以使用 base64 格式通过替换函数来转换变量(encryptedText)参数的类型

public string Encrypt(string plainText, X509Certificate2 cert)
{
    RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
    byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
    byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
    string encryptedText = Convert.ToBase64String(encryptedBytes);
    return encryptedText;
}

public string Decrypt(string encryptedText, X509Certificate2 cert)
{
    RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
    byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
    byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
    string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
    return decryptedText;
}
于 2017-06-26T15:21:21.870 回答
3

不要将加密数据视为字符串。加密算法对二进制数据起作用,并产生不能被解释为字符串的二进制数据。认为 UTF-8 或任何其他编码能够将任何给定的二进制数据块解释为有效字符串是天真的。

在您的情况下,如果您需要将加密数据输出到控制台以进行调试,请继续byte[]并将其转储为十六进制,如下所示:

for (int i = 0; i < data.Length; i++)
{
    Console.Write(data[i].ToString("X2"));
    Console.Write(" ");
    if ((i+1) % 16 == 0) Console.WriteLine();
}
于 2013-04-28T10:39:28.253 回答