哪种公钥算法适合视频和图像?

时间:2019-05-19 18:52:37

标签: encryption cryptography

我计划创建一个必须能够在客户端之间安全地(即加密)发送消息的应用程序。这些消息可能包括图像和视频(最大50MB)。由于公钥加密的工作原理,每个加密密钥必须运行一次加密过程。 由于这些原因,我正在寻找一种可以在现代设备(例如中级智能手机)上相当快速地加密媒体的算法。

我问这个问题是因为我遇到的所有算法(例如Blowfish和RSA)都具有相对较小的有效负载限制,这意味着即使图像也无法放入其中。

2 个答案:

答案 0 :(得分:3)

Don't roll your own protocol。您正在考虑这个at a far too low level。确切知道自己在做什么的人很难编写安全的代码。您甚至都不知道从哪里开始,所以您没有机会正确地做它。

如果您可以在两个端点之间建立直接连接,请使用TLS 。如果无法建立直接连接,请考虑使用TLS并中继加密的数据包;如果不切实际,请use Signal。 TLS无处不在;您的操作系统可能在其默认安装中附带了一个实现。信号不那么普遍,因此您可能必须嵌入一个库。确保跟上该库的更新。再一次,不要实现自己的库。


在幕后,所有使用公钥密码学来存储或传输多个字节数据的系统都使用hybrid cryptography。公钥加密用于建立对称密钥并验证数据,而对称加密则很繁重。

例如,RSA可用于加密对称密钥。但是,在实践中很难做到正确。它比使用椭圆曲线密码学的更现代的方法还慢。 TLS可以使用RSA加密,但是不建议使用。 TLS最好使用(elliptic curveDiffie-Hellman key exchange和RSA或(EC)DSA signature来建立安全连接。如果您想进一步了解TLS的工作原理,请阅读an overview of the protocola history of problems and how they were resolvedan explanation of why RSA encryption is problematic

请注意,河豚已经过时了一段时间。如果您需要选择特定的对称密码系统-which usually means you're doing it wrong-选择AES-GCM,AES-CCM或ChaCha20-Poly1305。

答案 1 :(得分:1)

您对RSA的输入大小是正确的。通常,对于任何公开密钥密码术而言,输入大小是有限的,并且与您的需求相反,它比您所需要的要慢很多。公钥加密通常用于共享小数据。

例如,在使用RSA(TLS_RSA_WITH_AES_128_GCM_SHA256)的TLS实现中,RSA步骤用于在2个参与方之间共享对称密钥(通常为AES),然后所有繁重的工作都由AES完成。 / p>

您需要的是symmetric encryption algorithm。您可以使用AES(密钥大小为128、192或什至256)加密任何大小的图像。 AES是block cipher,并且使用合适的block cipher mode,从理论上讲,它没有输入限制。 AES-128是NIST认可的相当标准的(FIPS 197)对称加密方案,因此它应该是安全的,但是您总是可以选择更大的密钥大小,例如256。

由于您已定义了算法的安全性,因此现在我们可以谈谈速度。 RSA:

$ openssl speed rsa2048
Doing 2048 bit private rsa's for 10s: 296 2048 bit private RSA's in 10.00s
Doing 2048 bit public rsa's for 10s: 6171 2048 bit public RSA's in 9.99s
LibreSSL 2.6.5
built on: date not available
options:bn(64,64) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: information not available
                  sign    verify    sign/s verify/s
rsa 2048 bits 0.033784s 0.001619s     29.6    617.7

GCM模式下的AES-128

$ openssl speed aes-128-gcm
Doing aes-128 gcm for 3s on 16 size blocks: 3778792 aes-128 gcm's in 2.99s
Doing aes-128 gcm for 3s on 64 size blocks: 1611239 aes-128 gcm's in 3.00s
Doing aes-128 gcm for 3s on 256 size blocks: 485243 aes-128 gcm's in 2.99s
Doing aes-128 gcm for 3s on 1024 size blocks: 125054 aes-128 gcm's in 2.99s
Doing aes-128 gcm for 3s on 8192 size blocks: 15366 aes-128 gcm's in 2.96s
LibreSSL 2.6.5
built on: date not available
options:bn(64,64) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: information not available
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128 gcm      20220.96k    34373.10k    41545.89k    42827.86k    42526.44k

您可以看到区别,即AES如何从速度上吹走RSA。由于其设计,对称加密算法本质上是更快的。非对称算法对较慢的数量和质数使用数学运算。

由于AES如此流行,CPU制造商开始实施特殊的指令以使AES计算越来越本地化(AES-NI)。因此,AES在几乎所有流行的CPU上都将更快。

关于RSA和AES之间的安全性的一点说明,尽管这就像将苹果与桔子进行比较。 RSA2048仅提供112位安全性,而AES128提供128位安全性(参考:aes-vs-rsa

上述问题的另一个挑战是密钥管理。您将如何安全地管理密钥?如果密钥是临时密钥,即基于会话的密钥或每次使用一个密钥,则可以使用RSA交换对称密钥,然后执行加密。这将保证完美的前向保密性。如果您需要持久密钥,那么显然有更多复杂的方法可以执行此操作,而这不在此问题的范围内。