我正在从事一项小型安全任务,并被指示在 C# 中使用 RSA 实现文件的简单加密/解密。
在尝试加密/解密大文件时,编译器通知我文件大小不能超过密钥长度。我可以通过将文件分成密钥大小的块并重复加密来解决这个问题,但这会危及我的 RSA 密钥吗?为什么或者为什么不?
我正在从事一项小型安全任务,并被指示在 C# 中使用 RSA 实现文件的简单加密/解密。
在尝试加密/解密大文件时,编译器通知我文件大小不能超过密钥长度。我可以通过将文件分成密钥大小的块并重复加密来解决这个问题,但这会危及我的 RSA 密钥吗?为什么或者为什么不?
RSA 加密适用于长度不超过公钥模数大小的消息(实际上限制略低于该长度,例如 1024 位 RSA 密钥为 117 个字节)。使用 RSA 加密事物的常用方法是使用混合模式:创建一个随机对称密钥(一堆随机字节,使用密码安全的随机数生成器),用该密钥对称加密数据(使用对称密码例如 AES),然后您使用 RSA 加密对称密钥。对称密码可以处理任意长度的数据。对称密钥相当短,通常为 16 或 32 字节,因此使用 RSA 加密没有问题。
请注意,您正在设计自己的加密协议,这是一个非常糟糕的主意。实际上,所有与密码学相关的坏主意中首先是最重要的。即使对于像 blob 的非对称加密这样看似简单的东西,试图设计这种协议的人也经历了多年的多个版本和安全漏洞,痛苦地被一个一个地堵住。你真的应该为此使用现有的协议。一种这样的协议是OpenPGP。Bouncy Castle是一个具有 C# 版本的开源库,其中包括一个 OpenPGP 实现。使用它,你会活得更久,更快乐。
使用此方法会丢失的一件事是攻击者可以删除或重放他们想要的任何块;没有验证。这可以通过将内容的哈希加密作为最后一个块来解决,但这种方案也可能存在其他问题。