所以,接下来我需要的是:
现在,我设法在this link之后创建了证书。那里的那个女孩一步一步地指示如何获得自签名证书,把它们放在店里等等......现在,我遇到问题的那部分:
我已设法使用此代码加密我的数据:
public static string Encrypt(string stringForEncription, string PathToPrivateKey)
{
X509Certificate2 myCertificate;
try
{
myCertificate = new X509Certificate2(PathToPrivateKey, "Test123");
}
catch (Exception e)
{
throw new CryptographicException("Unable to open key file.");
}
RSACryptoServiceProvider rsaObj;
if (myCertificate.HasPrivateKey)
{
rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey;
}
else
throw new CryptographicException("Private key not contained within certificate.");
if (rsaObj == null)
return String.Empty;
byte[] decryptedBytes;
byte[] array = Encoding.UTF8.GetBytes(stringForEncription);
try
{
decryptedBytes = rsaObj.Encrypt(array, false);
//decryptedBytes = rsaObj.Encrypt(Convert.FromBase64String(Base64EncryptedData), false);
}
catch (Exception e)
{
throw new CryptographicException("Unable to encrypt data.");
}
// Check to make sure we decrpyted the string
if (decryptedBytes.Length == 0)
return String.Empty;
else
return System.Text.Encoding.UTF8.GetString(decryptedBytes);
}
对于PathToPrivate键变量,我使用的是客户端ClientCert.pfx的路径。我不知道我是否应该使用其他任何东西,但是这里有我所有证书的文件夹:
现在,对于解密,我使用下一个代码:
public static string DecryptEncryptedData(string Base64EncryptedData, string PathToPrivateKey)
{
X509Certificate2 myCertificate;
try
{
myCertificate = new X509Certificate2(PathToPrivateKey, "Test123");
}
catch (Exception e)
{
throw new CryptographicException("Unable to open key file.");
}
RSACryptoServiceProvider rsaObj;
if (myCertificate.HasPrivateKey)
{
rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey;
}
else
throw new CryptographicException("Private key not contained within certificate.");
if (rsaObj == null)
return String.Empty;
byte[] decryptedBytes;
try
{
decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData), false);
}
catch (Exception e)
{
throw new CryptographicException("Unable to decrypt data.");
}
// Check to make sure we decrpyted the string
if (decryptedBytes.Length == 0)
return String.Empty;
else
return System.Text.Encoding.UTF8.GetString(decryptedBytes);
}
无论我尝试做什么,它都让我异常:
{"The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. "}
真的会帮助我帮助我。
答案 0 :(得分:0)
您收到错误的原因是您尝试Convert.FromBase64String
的字符串实际上不是base-64字符串。
加密数据后,应将字节数组转换为base-64字符串。 请使用Convert.ToBase64String。
return Convert.ToBase64String(decryptedBytes);
然后您的解密线将起作用:
decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData),false);
答案 1 :(得分:0)
这不是你可能想到的确切答案,但我在这里写,因为它的评论太长了。
我认为解密本身没有任何问题(我已经找到了使用php加密的代码示例博客)这就是为什么我评论我对加密字符串感到好奇,这是解密的目标。
我几个月来一直在努力理解安全性,现在我一起使用对称(AES)和非对称(RSA)。理解非常重要,每个人都需要时间......
RSA是非对称且单向的,这意味着加密只能通过公钥完成,而解密只能通过私钥完成。 您在加密方法中使用私钥,它似乎只是从解密中复制而来。
Zesty的答案仅限于格式化。您还需要了解格式。我们需要加密和解密中的Convert.ToBase64String和Convert.FromBase64String,从byte到base64string,反之亦然。但是这个base64string并不像'hello'那样简单 'sABlAGwAbABvACAAVwBvAHIAbABkAA =='如你所见here
我建议使用像blog这样的完整解决方案(不是像PHP加密这样的半个解决方案),这样加密和解密就可以和谐了。
正如我最后评论的那样,如果从客户端进行加密并且您没有良好的用户,则需要考虑如何防止黑人用户。
我希望我的经验有助于理解最重要的安全性。