2015-04-06 551 views
0

好吧,我正在寻找一种使用RSA和AES加密/解密较大文件的方法。 我不太明白我需要做什么。如何使用RSA/AES加密/解密较大的文件

这种情况是我有更大的文件(从200kb - 50mb的任何地方)。我希望能够加密在当前目录中留下密钥(私钥)的特定文件以及加密文件。然后用户可以保存该密钥,随身携带并稍后再解密该文件。

我只是不太明白如何一起使用AES/RSA来实现这一点。我有一些代码来做简单的RSA加密/解密和一些工作的AES代码。我从其他SO问题中获得了此代码。

我在C++中使用Openssl。

当前AES程序:(来自网络)

int main() { 

int bytes_read, bytes_written; 
    unsigned char indata[AES_BLOCK_SIZE]; 
    unsigned char outdata[AES_BLOCK_SIZE]; 

    /* ckey and ivec are the two 128-bits keys necesary to 
    en- and recrypt your data. Note that ckey can be 
    192 or 256 bits as well */ 
    unsigned char ckey[] = "thiskeyisverybad"; 
    unsigned char ivec[] = "dontusethisinput"; 

    /* data structure that contains the key itself */ 
    AES_KEY key; 

    /* set the encryption key */ 
    AES_set_encrypt_key(ckey, 128, &key); 

    /* set where on the 128 bit encrypted block to begin encryption*/ 
    int num = 0; 

    FILE *ifp = fopen("out.txt", "rb"); 
    FILE *ofp = fopen("outORIG.txt", "wb"); 

    while (true) { 
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp); 

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num, 
     AES_DECRYPT); //or AES_DECRYPT 

    bytes_written = fwrite(outdata, 1, bytes_read, ofp); 
    if (bytes_read < AES_BLOCK_SIZE) 
     break; 
    } 
+0

问题要求我们推荐或找到一本书,工具,软件库,教程或其他非本地资源,因为它们倾向于吸引自以为是的答案和垃圾邮件,所以不适合堆栈溢出。相反,请描述问题以及到目前为止解决问题所做的工作。 –

+0

解决了这个问题。 – Mohammad

+0

此编辑不能解决问题。 _“我有一些代码可以做简单的RSA加密/解密和一些部分工作的AES代码(加密工作正常,但不能解密超过特定文件大小)。”_然后将代码显示为最小样本,并准确解释您遇到的问题编译器/运行时错误)。 –

回答

5

好了,所以我正在寻找一种方法来加密/解密使用RSA和AES的文件。我不太明白我需要做的......

所有你需要做的是:

  • 下生成AES密钥
  • 随机加密AES密钥
  • 加密大文件RSA密钥下的AES密钥

另外,仅靠加密通常是不够的。这意味着您可以改进AES/CFB的选择。这是因为CFB(和CBC等其他模式)仅提供保密性。您无法检测到意外和恶意篡改。

要改善模式,您应该选择一种提供机密性和真实性的模式。 AES/GCM将是一个不错的选择。在OpenSSL wiki上有一个例子,它的地址为EVP Authenticated Encryption and Decryption

您可以在Authenticated Encryption的Crypto ++ wiki上阅读更多关于认证加密的信息。它是一个不同的库和不同的维基,但它提供了有关经过验证的加密的信息。在理想的世界中,OpenSSL将提供像Shoup的Elliptic Curve Integrated Encryption Scheme(ECIES)或Abdalla,Bellare和Rogaway的Diffie-Hellman Authenticated Encryption Scheme(DHAES)这样的集成加密方案。一个集成的加密方案可以完成所有这些工作。

顺便说一下,Crypto++是一个C++加密库,它提供了两种集成加密方案。也许你应该考虑切换安全库。以下是ECIES上的示例代码文档。

+0

我不明白RSA在这里的角色。这里有一个选项:1)使用PBKDF2等来制作AES密钥。 2)将密钥通过安全通道传递给其他用户,完成。唯一的问题是如果安全通信不可用。这对于RSA来说是可行的。大文件(高达50 Mb)的验证看起来像是矫枉过正。我明白如何在CTR/OFB模式下混淆小文件,但任何使用CFB/CBC的强化都会毁掉整个文件。也许我需要开始一个新的问题。 –

+1

@Barmak - *“我明白如何在CTR/OFB模式下混淆小文件,但任何使用CFB/CBC进行调和都会破坏整个文件,也许我需要提出一个新的问题。”* - no需要开始一个新的问题。阅读关于Authenticated Encryption的文章。它会告诉你你需要知道的一切。或者在代码项目上查看[Authenticated Encryption](http://www.codeproject.com/Articles/34380/Authenticated-Encryption)。我能够篡改示例许可证文件,并使用CFB模式将'licenses = 10'更改为'licenses = 30','50'和'70' :)无需解密。 – jww

+0

@Barmak - *“...唯一的问题是如果安全通信不可用...” - - 好吧,现在这是一个不同的要求。你原来的问题让我相信这是本地的,长期的存储。对于安全通信,您需要像Ephemeral Diffie-Hellman(包括EC变体),MQV,Fully-Hashed MQV等密钥协议算法。您应该将讨论移至[Information Security Stack Exchange](http:// security .stackexchange.com /),以便您可以讨论安全体系结构的要求和设计。 – jww