首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AES进行端到端加密

如何使用AES进行端到端加密
EN

Stack Overflow用户
提问于 2017-06-23 23:49:06
回答 1查看 4.1K关注 0票数 0

因此,我试图实现一种简单的端到端加密方案,客户端通过使用其私钥加密与另一个客户端进行握手,将公钥发送给第二个客户端私钥加密,用客户端1的私钥解密,然后发送回客户端2,这样客户端2就拥有了公钥。我正在使用C#.Net提供的Aes类,似乎无法使它正常工作。

我得到的错误是关于填充,我已经看到您可以完全移除填充,但是有人告诉我,这不是一个好主意。有人能解释原因吗?此外,我如何知道将解密/加密设置为能够查看有效密钥的填充。

这是我拥有的

代码语言:javascript
复制
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;
        }
    }
}

当我试图做的时候

代码语言:javascript
复制
var decryptedOnce = c.DecryptMessage(encryptedTwice);

我收到“密码异常填充无效,不能删除”。

EN

回答 1

Stack Overflow用户

发布于 2017-06-24 00:04:51

首先,AES是一种对称分组密码,其本身不足以实现端到端加密.它可以作为端到端加密的部件,但是对于实际的“端到端”的设计,需要像RSA这样的非对称密码系统。通常,AES被简单地用作实际数据的密码,因为RSA通过一个共同的服务器在两个客户端之间进行密钥交换。

其次,关于您的代码,您的错误在于假设可以将随机二进制数据转换为字符串:System.Text.Encoding.Default.GetString(encrypted)

你不能这么做。将原始数据转换为UTF8 (应该使用什么而不是ASCII)并再次返回并不总是会给出相同的数据,因为字符编码是如何工作的。我建议您使用Convert.ToBase64String,它将转换为base64格式,这是为将二进制数据表示为普通字符串字符而设计的格式,并将在转换之间维护数据。

此处填充物的错误只是上面所写内容的副作用。不要移除垫子。

最后,我建议您在继续此项目之前认真阅读密码学主题。我希望您不打算在生产中使用它,但是如果您这样做了,那么上面的代码有许多缺陷。不要在生产代码中使用它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44731363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档