因此,我试图实现一种简单的端到端加密方案,客户端通过使用其私钥加密与另一个客户端进行握手,将公钥发送给第二个客户端私钥加密,用客户端1的私钥解密,然后发送回客户端2,这样客户端2就拥有了公钥。我正在使用C#.Net提供的Aes类,似乎无法使它正常工作。
我得到的错误是关于填充,我已经看到您可以完全移除填充,但是有人告诉我,这不是一个好主意。有人能解释原因吗?此外,我如何知道将解密/加密设置为能够查看有效密钥的填充。
这是我拥有的
class Program
{
static void Main(string[] args)
{
Connection c = new Connection();
Connection d = new Connection();
var encrypted = c.EncryptMessage("stackoverflow");
var decrypted = c.DecryptMessage(encrypted);
var encryptedTwice = d.EncryptMessage(System.Text.Encoding.Default.GetString(encrypted));
var decryptedOnce = c.DecryptMessage(encryptedTwice);
var decryptedTwice = d.DecryptMessage(Encoding.ASCII.GetBytes(decryptedOnce));
Console.WriteLine("Encrypted: " + System.Text.Encoding.Default.GetString(encrypted));
Console.WriteLine("Decrypted: " + decrypted);
Console.WriteLine("Decrypted twice: " + decryptedTwice);
Console.ReadKey();
}
}
class Connection
{
private Aes _encryption;
Connection()
{
_encryption = Aes.Create();
}
public byte[] EncryptMessage(string message)
{
byte[] encrypted;
ICryptoTransform encryptor = _encryption.CreateEncryptor(_encryption.Key, _encryption.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(message);
}
encrypted = msEncrypt.ToArray();
}
}
// Return the encrypted bytes from the memory stream.
return encrypted;
}
public string DecryptMessage(byte[] message)
{
string decrypted = "";
ICryptoTransform decryptor = _encryption.CreateDecryptor(_encryption.Key, _encryption.IV);
using (MemoryStream msDecrypt = new MemoryStream(message))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
decrypted = srDecrypt.ReadToEnd();
}
}
return decrypted;
}
}
}当我试图做的时候
var decryptedOnce = c.DecryptMessage(encryptedTwice);我收到“密码异常填充无效,不能删除”。
发布于 2017-06-24 00:04:51
首先,AES是一种对称分组密码,其本身不足以实现端到端加密.它可以作为端到端加密的部件,但是对于实际的“端到端”的设计,需要像RSA这样的非对称密码系统。通常,AES被简单地用作实际数据的密码,因为RSA通过一个共同的服务器在两个客户端之间进行密钥交换。
其次,关于您的代码,您的错误在于假设可以将随机二进制数据转换为字符串:System.Text.Encoding.Default.GetString(encrypted)。
你不能这么做。将原始数据转换为UTF8 (应该使用什么而不是ASCII)并再次返回并不总是会给出相同的数据,因为字符编码是如何工作的。我建议您使用Convert.ToBase64String,它将转换为base64格式,这是为将二进制数据表示为普通字符串字符而设计的格式,并将在转换之间维护数据。
此处填充物的错误只是上面所写内容的副作用。不要移除垫子。
最后,我建议您在继续此项目之前认真阅读密码学主题。我希望您不打算在生产中使用它,但是如果您这样做了,那么上面的代码有许多缺陷。不要在生产代码中使用它。
https://stackoverflow.com/questions/44731363
复制相似问题