2010-05-13 105 views
2

概述: 我试图设计一个应用程序,将加密文件安全发送通过蜗牛邮件(大型数据集)。我打算使用.Net的AES/RijndaelManaged加密来初始化文件,使用RNGCryptoServiceProvider随机生成的密钥进行加密。然后我用RSA公钥对这个随机AES密钥进行加密。数据的接收者是唯一具有RSA私钥解密的数据。使用AES加密文件,使用RSA加密密钥 - 我在正确的轨道上吗?

我的问题:这是做这种事情的正确方法吗?如果是这样,发送这个RSA加密密钥与数据是否安全,因为它需要私钥解密?

编辑 - 根据答案,这确实是正确的路要走。

编辑 - 谢谢你的回复。现在我真正想知道的是:
当最终用户生成他们的公钥/私钥对时,保存私钥的最佳方式是什么?我不希望它只能从一台机器访问,所以我试图避免使用用户的密钥存储。但MSDN表示将密钥保存到文件并不安全,那么您还能如何实现这一目标?

+0

听起来不错。增加大文件的速度,并且您还可以支持多个收件人,方法是多次包含您的AES密钥,并使用不同的RSA密钥加密。 – Thorarin 2010-05-13 18:48:49

+0

你对RSA公钥使用什么来加密你提到的RSA密钥?我假设你正在使用RSA CBC模式? – JM4 2010-12-09 15:46:44

回答

3

使用PGP除非有充分的理由不这样做。 PGP是电子邮件中常用的混合加密标准的开放和无处不在的标准。 PGP有许多实现。我知道的唯一一个.NET是BouncyCastle crypto project's C# library。 PGP实际上提供了您描述的功能的超集;例如,PGP也可以对消息进行数字签名。

关于私钥存储。典型的解决方案是在将密钥写入磁盘之前对称地加密私钥。只有私钥的真正所有者知道密码的秘密,并且他们不会告诉任何人。这样,即使攻击者获得私钥文件,他们仍然不得不妥协秘密或强制对称密码。我所知道的所有PGP实现都是这样做的。

请不要重新实现PGP,如果它做你想做的。 PGP得到了广泛的支持。此外,像我这样的凡人(大概是你自己)几乎没有机会让一切正常。

+0

+1,用于推荐PGP而不是重新开始。 – 2010-05-13 19:08:55

+0

谢谢,我会看看我是否能够使用PGP。当我想在这里使用预先存在的工具时,我通常遇到了障碍,他们喜欢在家中做所有事情。 :( – 2010-05-13 19:17:13

+0

密码学应该永远不会在室内完成,除非你的房子充满了世界级的密码学家和数学家 – 2010-05-24 20:09:44

3

至于你的第一部分,这绝对是它的方式。它被称为hybrid cryptosystem

+0

谢谢,知道它的名字将肯定有助于我的研究! – 2010-05-13 18:48:41

2

这实质上是SSL所做的。 RSA用于对称会话密钥(如AES)的认证和密钥交换,然后用于通信主体。

0

保存私钥的传统方法(在GPG/PGP/PKCS#1/PKCS#8中使用)是使用强密码短密码保护并将其保存在文件中。大多数密钥库管理工具都可以使用PKCS#1/PKCS#8格式导出密钥 - 您可以在一台机器上生成密钥,使用密码导出密钥并将其导入另一台机器;密钥仅在密钥库之外以便在机器之间传输。